获取包含调用函数的脚本的路径

bzz*_*zzr 5 python

假设我有两个文件,foo.py并且bar.py. 它们位于何处并不重要,只要以foo.py某种方式设法导入并调用后者中定义的bar.py函数即可。func()我如何获得foo.pyfrom的绝对路径bar.func()

mar*_*eau 6

我不确定“获取foo.pyfrom的绝对路径bar.func()”是什么意思。但是,函数可以通过使用返回sys._getframe()调用堆栈并检查调用函数的全局变量(namespace下面代码中的变量)来确定谁在运行时调用它。下面的示例展示了如何执行此操作:

\n

foo.py

\n
import bar\n\nbar.func()\n
Run Code Online (Sandbox Code Playgroud)\n

bar.py

\n
from pprint import pprint\nimport sys\n\ndef func():\n    namespace = sys._getframe(1).f_globals  # caller\'s globals\n    pprint(namespace)\n    print("caller\'s path:", namespace[\'__file__\'])\n
Run Code Online (Sandbox Code Playgroud)\n

示例输出:

\n
import bar\n\nbar.func()\n
Run Code Online (Sandbox Code Playgroud)\n

看到\'__file__\'返回的字典中的条目了吗?它是源文件 \xe2\x80\x94 foo.py\xe2\x80\x94 的绝对路径,其中包含对bar.func().

\n