如果以下函数在另一个文件中定义,并在另一个文件中返回并执行,它会给出定义位置的文件名吗?还是在哪里叫它?
File1.py
-----
def get_current_filename():
return lambda: os.path.realpath(os.path.abspath(__file__))
File2.py
----
import File1
x= File1.get_current_filename()
x()
答案 0 :(得分:2)
这将使用定义的文件名,即File1.py
。
在模块加载期间,导入系统会在每个模块对象上填充__file__
属性。文档here。
请注意,这里没有获取调用模块文件名(File2.py
)的受支持方法,只有黑客才能做到。避免。
答案 1 :(得分:2)
正如wim所说,该函数的执行方式为__file__
将返回该函数在(File1.py)中存在的文件的名称。
尽管有如wim所说的那样有点hacky,但是仍然可以实现您想要的。您可以使用inspect.stack
通过查看调用堆栈中的帧记录来实现:
File1.py:
import inspect
def get_current_filename():
return inspect.stack()[1][1]
File2.py:
import File1
x = File1.get_current_filename()
print(x)
输出:
C:\<omitted>\File2.py
第一个[1]
表示要查看调用堆栈中的第二个帧(第一个帧是调用inspect.stack
的位置,第二个帧是调用该位置的位置),第二个{{ 1}}从框架中获取文件名。