我有一个如下所示的目录结构:
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
模块中进行更复杂的更改{1}} 以及作为foo
包,以便文件读取成功。
当我需要使用具有多个嵌套子模块的git模块时,会发生这种情况。显然,做出这么多改变并不是很方便。
答案 0 :(得分:1)
一种解决方案可以是使用您自己的函数来屏蔽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()函数。
根据documentation,我使用buffering =-1
似乎是默认值,如果不需要,你可以完全忽略该论点。
如果可能的话,你不应该掩饰(也许使用不同的名字,如 - open_file()
),但似乎你不想这样做。
虽然我仍然认为只有在没有其他解决方案时才应该进行掩蔽。此外,请注意,您不应该导入db.py
作为from db import *
,这可能导致open()
在其导入的其他.py
文件中出现类似屏蔽(理想情况下,它不是建议在任何情况下进行from <module> import *
。
答案 1 :(得分:0)
使用此模块将解决此导入错误问题,您提到的错误是路径问题。所以错误是python解释器coulnt找到模块指定的路径。如果您使用此模块,它将正常工作。
sys.path
指定模块搜索路径的字符串列表。从环境变量PYTHONPATH初始化,加上依赖于安装的默认值
import sys
sys.path.append('..\Desktop\New folder')# folder destination
from foo import db