当不同层级的 Python 模块相互调用时, 我们会发现原本在一个模块中写死的相对路径会导致找不到文件的报错. 这种问题该怎么解决呢?
先说结论
复制下面的代码, 放到你的模块内 (或者保存为一个 .py 文件), 调用 relpath
函数即可.
def relpath(file):
""" Always locate to the correct relative path. """
from sys import _getframe
from pathlib import Path
frame = _getframe(1)
curr_file = Path(frame.f_code.co_filename)
return str(curr_file.parent.joinpath(file).resolve())
运行效果:
特点:
- 不到 10 行代码
- 无第三方库依赖
- 使用简单, 只需把原先写死的相对路径, 替换为
relpath({之前写的路径})
即可 - 此外, Pycharm 还能够识别到文件参数, 在你键入时自动给出路径提示
更复杂的情况演示:
someprj
|- relpath.py
|- A
|- a.py
|- AA
|- aa.py
|- AAA
|- aaa.py
|- B
|- b.txt
# A/a.py
def show_path():
from relpath import relpath
print(relpath('../B/b.txt'))
if __name__ == '__main__':
from A.AA import aa
from A.AA.AAA import aaa
show_path() # -> '/someprj/B/b.txt'
aa.show_path() # -> '/someprj/B/b.txt'
aaa.show_path() # -> '/someprj/B/b.txt'
# A/AA/aa.py
def show_path():
from relpath import relpath
print(relpath('../../B/b.txt'))
if __name__ == '__main__':
from A import a
from A.AA.AAA import aaa
show_path() # -> '/someprj/B/b.txt'
a.show_path() # -> '/someprj/B/b.txt'
aaa.show_path() # -> '/someprj/B/b.txt'
# A/AA/AAA/aaa.py
def show_path():
from relpath import relpath
print(relpath('../../../B/b.txt'))
if __name__ == '__main__':
from A import a
from A.AA import aa
show_path() # -> '/someprj/B/b.txt'
a.show_path() # -> '/someprj/B/b.txt'
aa.show_path() # -> '/someprj/B/b.txt'