如果文件{{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')
答案 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笔记本电脑。