首页 > 解决方案 > 获取包含调用函数的脚本路径

问题描述

假设我有两个文件,foo.py并且bar.py. 它们的位置无关紧要,只是以foo.py某种方式设法导入bar.py和调用func()后者中定义的函数。我将如何获得foo.pyfrom的绝对路径bar.func()

标签: python

解决方案


我不确定“获取foo.pyfrom的绝对路径”是什么意思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().


推荐阅读