我正在尝试让包中的模块在其目录中打开一个txt文件并读取其内容。
这是我的安排:
package
| __init__.py
| bar.py
| baz.py
| txt.txt
foo.py
这是txt.txt
a()
这是baz.py
def a():
with open("txt.txt") as file:
print(file.read())
这是bar.py
from .baz import a
def b():
a()
print("b()")
这是__init__.py
from .bar import b
def c():
b()
print("c()")
这是foo.py
from package import c
c()
运行foo.py时我希望得到
a()
b()
c()
但是我得到了这个错误
Traceback (most recent call last):
File "foo.py", line 2, in <module>
c()
File "(...my full path...)\package\__init__.py", line 3, in c
b()
File "(...my full path...)\package\bar.py", line 3, in b
a()
File "(...my full path...)\package\baz.py", line 2, in a
with open("txt.txt") as file:
FileNotFoundError: [Errno 2] No such file or directory: 'txt.txt'
我将open
函数"txt.txt"
的参数更改为完整路径,并且可以正常工作,但这并不是很有用,因为我必须使用相对路径,而且我不理解发生了什么事。
有什么建议吗?
答案 0 :(得分:1)
在Python中,在这种情况下,路径是相对于调用脚本的foo.py
。
如果您想通过调用txt.txt
阅读foo.py
,则需要像这样修改baz.py
def a():
with open("package/txt.txt") as file:
print(file.read())
import os
import sys
def a():
with open(os.path.join(os.path.dirname(sys.modules[__name__].__file__),"txt.txt")) as file:
print(file.read())
答案 1 :(得分:1)
您可以将PYTHONPATH
环境变量设置为指向软件包,也可以相对于txt.txt
的运行地址来访问foo.py
对于第一个选项,您可以执行以下操作:
PYTHONPATH=path/to/package python foo.py
对于第二个选项,首先将目录更改为package,然后运行foo.py