たとえば、a.boo
メソッドはメソッドを呼び出しますb.foo
。メソッドでは、どうすればのファイル名を取得できますか(メソッドにb.foo
渡したくない)...__file__
b.foo
28819 次
6 に答える
56
inspect
モジュールを使用してこれを実現できます。
frame = inspect.stack()[1]
module = inspect.getmodule(frame[0])
filename = module.__file__
于 2012-12-04T09:08:11.553 に答える
20
Python 3.5+
一発ギャグ
完全なファイル名(パスとファイル拡張子を含む)を取得するには、呼び出し先で次を使用します。
import inspect
filename = inspect.stack()[1].filename
フルファイル名とファイル名のみ
呼び出し元のファイル名を取得するには、inspect.stack()を使用します。さらに、次のコードは、完全なファイル名の最初のパスと最後のファイル拡張子もトリミングします。
# Callee.py
import inspect
import os.path
def get_caller_info():
# first get the full filename (including path and file extension)
caller_frame = inspect.stack()[1]
caller_filename_full = caller_frame.filename
# now get rid of the directory (via basename)
# then split filename and extension (via splitext)
caller_filename_only = os.path.splitext(os.path.basename(caller_filename_full))[0]
# return both filename versions as tuple
return caller_filename_full, caller_filename_only
その後、次のように使用できます。
# Caller.py
import callee
filename_full, filename_only = callee.get_caller_info()
print(f"> Filename full: {filename_full}")
print(f"> Filename only: {filename_only}")
# Output
# > Filename full: /workspaces/python/caller_filename/caller.py
# > Filename only: caller
公式ドキュメント
- os.path.basename():ファイル名からパスを削除します(拡張子は引き続き含まれます)
- os.path.splitext():ファイル名とファイル拡張子を分割します
于 2020-02-19T10:15:03.193 に答える
18
泥棒マスターの答えに触発されましたが、inspect.getmodule()
戻った場合にも機能しますNone
:
frame = inspect.stack()[1]
filename = frame[0].f_code.co_filename
于 2018-09-06T10:31:42.313 に答える
7
inspect
これは、モジュールを使用して実行できます。具体的には、次のようになりますinspect.stack
。
import inspect
import os.path
def get_caller_filepath():
# get the caller's stack frame and extract its file path
frame_info = inspect.stack()[1]
filepath = frame_info[1] # in python 3.5+, you can use frame_info.filename
del frame_info # drop the reference to the stack frame to avoid reference cycles
# make the path absolute (optional)
filepath = os.path.abspath(filepath)
return filepath
デモンストレーション:
import b
print(b.get_caller_filepath())
# output: D:\Users\Aran-Fey\a.py
于 2019-04-02T08:12:43.630 に答える
3
traceback
モジュールを使用できます。
import traceback
次のようにバックトレースを印刷できます。
print traceback.format_stack()
私はこれを何年も使用していませんが、これで十分に始めることができます。
于 2012-12-04T09:09:11.097 に答える
2
これらすべての解決策を読んで、これもうまくいくように見えますか?
import inspect
print inspect.stack()[1][1]
フレームの2番目の項目は、すでに呼び出し元のファイル名です。これは堅牢ではありませんか?
于 2019-01-30T17:14:48.637 に答える