gpt4 book ai didi

Python:模块中相对路径的使用

转载 作者:太空宇宙 更新时间:2023-11-03 17:31:10 25 4
gpt4 key购买 nike

我的目录结构如下所示:

foo/
__init__.py
db.py
database.db
main.py

现在,在db.py中,我读取了数据库的内容:

open('database.db').read()

只要我直接运行 db.py 就可以了。但是,当我尝试在 main 中导入 foo 包,然后运行 ​​db.py 时,它失败并出现文件未找到错误。

如何避免这种情况? (最好不要对 foo 包中的模块进行任何更改)

(注意:我知道像 Relative paths in Python 这样的解决方案,但这需要对我的 foo 包进行大量修改)

编辑1:是否无法在__init__.py中添加一些内容以便Python可以找到我的文件?

编辑 2:作为另一个小例子,考虑一下当我开始使用嵌套包时会发生什么:

foo/
baz/
__init__.py
mod.py
modules.json
__init__.py
db.py
database.py
main.py

现在,如果 main.py 使用 foo 包,并且 db.py 需要 baz 包,然后我需要开始在 baz 以及 foo 包的模块中进行更复杂的更改,以便文件读取成功.

当我需要使用具有多个嵌套子模块的 git 模块时,就会发生这种情况。显然,做这么多改变并不是很方便。

最佳答案

一种解决方案是屏蔽 open()函数与您自己的函数,在 db.py ,并在该定制中 open()函数,追加__file__目录后即可打开文件。示例-

def open(file,mode='r',buffering=-1):
import __builtin__ #use import builtins for Python 3.x
import os.path
filePath = os.path.join(os.path.dirname(__file__),file)
return __builtin__.open(filePath,mode,buffering)

__builtin__.open() (或对于 Python 3.x - builtins.open() )指向内置 open() 函数。

我用过buffering =-1因为根据 documentation 这似乎是默认值,如果不需要,您可以完全省略该参数。

如果可能,您不应该屏蔽(也许使用不同的名称,例如 - open_file() ),但似乎您不想这样做。

尽管我仍然认为只有在没有其他解决方案的情况下才应该进行屏蔽。另外,请注意您不应该导入 db.pyfrom db import * ,这可能会导致 open() 的类似屏蔽在另一个.py文件导入位置(理想情况下,不建议在任何情况下执行 from <module> import *)。

关于Python:模块中相对路径的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31829547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com