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

时间:2019-04-20 10:15:39

标签: python python-3.x

我正在尝试让包中的模块在其目录中打开一个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"的参数更改为完整路径,并且可以正常工作,但这并不是很有用,因为我必须使用相对路径,而且我不理解发生了什么事。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

在Python中,在这种情况下,路径是相对于调用脚本的foo.py

如果您想通过调用txt.txt阅读foo.py,则需要像这样修改baz.py

def a():
    with open("package/txt.txt") as file:
        print(file.read())

或者,您可以像这样使用ossys来检索包路径

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