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

时间:2018-07-23 21:49:02

标签: python

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

3 个答案:

答案 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"))