获取调用者函数的文件绝对路径?

时间:2019-04-02 07:46:35

标签: python python-3.x path

如果文件{{1}中有方法t1,并且有文件a.py,该文件从b.py文件中调用方法t1。如何在a.py方法中获取b.py文件的完整/绝对路径?

使用inspect模块(就像这里的how to get the caller's filename, method name in python一样),我可以获得文件的相对路径,但似乎它不包含绝对路径(或者有一些其他属性对象可以访问以获得它吗? )。

例如:

a.py:

t1

b.py:

def t1():
    print('callers absolute path')

5 个答案:

答案 0 :(得分:0)

您可以使用python中的os模块来获取它。

>>> import a
>>> os.path.abspath(a.__file__)

答案 1 :(得分:0)

使用os模块,您可以执行以下操作:

a.py

import os

def t1(__file__):
    print(os.path.abspath(__file__))

b.py

from a import t1
t1(__file__)  # shoult print absolute path for `b.py`

这样,您可以调用t1(__file__并获取任何文件的绝对路径。

答案 2 :(得分:0)

import os
import inspect


def get_cfp(real: bool = False) -> str:
    """Return caller's current file path.

    Args:
        real: if True, returns full path, otherwise relative path
            (default: {False})
    """
    frame = inspect.stack()[1]
    p = frame[0].f_code.co_filename
    if real:
        return os.path.realpath(p)
    return p

从另一个模块运行:

from module import my_module
p1 = my_module.get_cfp()
p2 = my_module.get_cfp(real=True)
print(p1)
print(p2)

打印:

test_path/my_module_2.py
/home/user/python-programs/test_path/my_module_2.py

答案 3 :(得分:0)

使用sys._getframe()

a1.py

import sys
def t1():
    print(sys._getframe().f_code)

a2.py

from a1 import t1
t1()  # should print absolute path for `b.py`

因此

py -m a2.py

输出

<code object t1 at 0x0000029BF394AB70, file "C:\Users\dirtybit\PycharmProjects\a1.py", line 2>

编辑

使用inspect

a1.py

import inspect
def t1():
    print("Caller: {}".format(inspect.getfile(inspect.currentframe())))

a2.py

from a1 import t1
t1()  # should print absolute path for `b.py`

输出

Caller: C:\Users\dirtybit\PycharmProjects\a1.py

答案 4 :(得分:0)

诀窍在于恢复当前工作目录该目录到调用者文件的相对路径(此处为b.py)。其余的由联接完成。

a.py:

    import os
    import sys
    def t1():
        namespace = sys._getframe(1).f_globals
        cwd = os.getcwd()
        rel_path = namespace['__file__']
        abs_path= os.path.join(cwd,rel_path)
        print('callers absolute path!',abs_path)

b.py:

    from a import t1
    t1()  # prints absolute path for `b.py`

不幸的是,该技巧不适用于Jupyter笔记本电脑。