说我有两个文件,foo.py
和bar.py
。它们的位置无关紧要,只是foo.py
设法以某种方式导入bar.py
并调用后者中定义的函数func()
。我如何从foo.py
获得bar.func()
的绝对路径?
答案 0 :(得分:2)
我不确定“从foo.py
获取bar.func()
的绝对路径”是什么意思。但是,函数可以通过使用sys._getframe()
来遍历调用堆栈并检查调用函数的全局变量(在下面的代码中保存了变量namespace
)来确定谁在运行时在调用它。这是显示如何执行此操作的示例:
foo.py
import bar
bar.func()
bar.py
from pprint import pprint
import sys
def func():
namespace = sys._getframe(1).f_globals # caller's globals
pprint(namespace)
print("caller's path:", namespace['__file__'])
示例输出:
{'__annotations__': {},
'__builtins__': <module 'builtins' (built-in)>,
'__cached__': None,
'__doc__': None,
'__file__': '\\Stack Overflow\\get-path-of-calling-script\\foo.py',
'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0085A7D0>,
'__name__': '__main__',
'__package__': None,
'__spec__': None,
'bar': <module 'bar' from '\\Stack Overflow\\get-path-of-calling-script\\bar.py'>,
'sys': <module 'sys' (built-in)>}
caller's path: \Stack Overflow\get-path-of-calling-script\foo.py
在返回的字典中看到'__file__'
条目吗?这是包含对foo.py
的调用的源文件bar.func()
的绝对路径。
答案 1 :(得分:0)
在func中,您可以使用inspect:
def func():
stack = inspect.stack()
calling_context = next(context for context in stack if context.filename != __file__)
print(calling_context.filename)
编辑:我刚刚看到jasonharper的评论提出了相同的解决方案。另请阅读abarnet的评论。
答案 2 :(得分:0)
要获取绝对路径,您还可以尝试以下操作:
import os
print(os.path.abspath("foo.py"))