假设我有一个结构如下的 python 项目:
project
/data
test.csv
/package
__init__.py
module.py
main.py
__init__.py
:
from .module import test
module.py
:
import csv
with open("..data/test.csv") as f:
test = [line for line in csv.reader(f)]
main.py
:
import package
print(package.test)
当我运行 main.py
时,出现以下错误:
C:\Users\Patrick\Desktop\project>python main.py
Traceback (most recent call last):
File "main.py", line 1, in <module>
import package
File "C:\Users\Patrick\Desktop\project\package__init__.py", line 1, in <module>
from .module import test
File "C:\Users\Patrick\Desktop\project\package\module.py", line 3, in <module>
with open("../data/test.csv") as f:
FileNotFoundError: [Errno 2] No such file or directory: '../data/test.csv'
但是,如果我从 package
目录运行 module.py
,我不会收到任何错误。因此,似乎 open(...)
中使用的相对路径仅相对于原始文件的运行位置(即 __name__ == "__main__"
)?我不想使用绝对路径。有什么方法可以解决这个问题?
原文由 pbreach 发布,翻译遵循 CC BY-SA 4.0 许可协议
相对路径是相对于 当前工作目录 的。如果您不希望自己的道路成为现实,那么它必须是绝对的。
但是有一个常用的技巧可以从当前脚本构建绝对路径:使用它的
__file__
特殊属性:这需要 python 3.4+(对于 pathlib 模块)。
如果您仍然需要支持旧版本,您可以获得相同的结果:
[ 2020 年编辑: python3.4+ 现在应该是常态,所以我首先移动了受 jpyams 评论启发的 pathlib 版本]