現在のモジュールのパスが必要な場合は、__file__
.
ここで、それを返す関数が必要だとしましょう。私はできません:
def get_path():
return __file__
関数が宣言されているモジュールのパスを返すためです。
関数がモジュールのルートではなく、ネストの任意のレベルで呼び出された場合でも、機能する必要があります。
これは私がそれを行う方法です:
import sys
def get_path():
namespace = sys._getframe(1).f_globals # caller's globals
return namespace.get('__file__')
globals
その場合、dictから取得します。
def get_path():
return globals()['__file__']
コメントに応じて編集: 次のファイルが与えられた場合:
# a.py
def get_path():
return 'Path from a.py: ' + globals()['__file__']
# b.py
import a
def get_path():
return 'Path from b.py: ' + globals()['__file__']
print get_path()
print a.get_path()
これを実行すると、次の出力が得られます。
C:\workspace>python b.py
Path from b.py: b.py
Path from a.py: C:\workspace\a.py
絶対パスと相対パスが異なることに加えて(簡潔にするために、それは省略します)、私には良さそうです。
inspect モジュールでそれを行う方法を見つけました。私はこの解決策で問題ありませんが、誰かがスタックトレース全体をダンプせずにそれを行う方法を見つけた場合、それはよりクリーンになり、彼の答えを感謝して受け入れます:
def get_path():
frame, filename, line_number, function_name, lines, index =\
inspect.getouterframes(inspect.currentframe())[1]
return filename