Python 如何从具有相对路径的包中的模块内部打开文件?

Python 如何从具有相对路径的包中的模块内部打开文件?,python,python-3.x,Python,Python 3.x,我试图让包中的模块打开其目录中的txt文件并读取其内容 这就是我的安排: package | __init__.py | bar.py | baz.py | txt.txt foo.py 这是txt.txt a() 这是baz.py def a(): 打开(“txt.txt”)作为文件: 打印(file.read()) 这是bar.py的内容 从.baz导入a def b(): () 打印(“b()”) 这是\uuuu init\uuuuu.py 从.bar导入b def c(

我试图让包中的模块打开其目录中的txt文件并读取其内容

这就是我的安排:

package
|  __init__.py
|  bar.py
|  baz.py
|  txt.txt

foo.py
这是
txt.txt

a()
这是
baz.py

def a():
打开(“txt.txt”)作为文件:
打印(file.read())
这是
bar.py的内容

从.baz导入a
def b():
()
打印(“b()”)
这是
\uuuu init\uuuuu.py

从.bar导入b
def c():
b()
打印(“c()”)
这是
foo.py

从包导入c
c()
运行foo.py时,我希望

a()
b()
c()
但是我却犯了这个错误

回溯(最近一次呼叫最后一次):
文件“foo.py”,第2行,在
c()
文件“(…我的完整路径…\package\\uuuuu init\uuuuu.py”,第3行,c语言
b()
文件“(…我的完整路径…\package\bar.py”,第3行,在b中
()
文件“(…我的完整路径…\package\baz.py”,第2行,在
打开(“txt.txt”)作为文件:
FileNotFoundError:[Errno 2]没有这样的文件或目录:“txt.txt”
我将
open
函数
“txt.txt”
的参数更改为完整路径,它起了作用,但这并不是很有用,因为我必须使用相对路径,我不知道发生了什么


有什么建议吗?

在Python中,路径是相对于调用脚本的,在本例中是
foo.py

如果您想从调用
foo.py
读取
txt.txt
,您需要像这样修改
baz.py

def a():
打开(“package/txt.txt”)作为文件:
打印(file.read())
或者,您可以使用和类似的方法检索包路径

导入操作系统
导入系统
定义a():
将open(os.path.join(os.path.dirname(sys.modules[\uuuuuu name\uuuuuuu]。\uuuuuuu file\uuuuuuuu),“txt.txt”)作为文件打开:
打印(file.read())

您可以将
PYTHONPATH
环境变量设置为指向您的包,也可以相对于运行
foo.py

对于第一个选项,您可以执行以下操作:
PYTHONPATH=path/to/package python foo.py

对于第二个选项,首先将目录更改为package,然后从相对路径
text.txt
不存在的位置运行
foo.py

foo.py
。如果从与
package
目录相同的位置运行
foo.py
,请使用
package/text.txt
作为文件路径。记住:是什么决定了你的代码运行的路径,而不是运行的代码所在的位置。如果你对相对路径有疑问,请使用绝对路径。模块的
\uu文件\uu
属性与
pathlib
os.path
中的函数结合使用可能会有所帮助。