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

2024-04-26 23:07:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图让一个包中的模块打开它的目录中的一个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"改成了完整路径,结果成功了,但这并不是很有用,因为我必须使用相对路径,而且我不明白发生了什么。你知道吗

有什么建议吗?你知道吗


Tags: inpytxtpackage内容fooinitdef
2条回答

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

对于第一个选项,您可以执行以下操作: PYTHONPATH=path/to/package python foo.py 对于第二个选项,首先将目录更改为package,然后运行foo.py

在Python中,路径是相对于调用脚本的,在本例中是foo.py。你知道吗

如果您想从调用foo.py读取txt.txt,您需要这样修改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())

相关问题 更多 >