我有一个看起来像这样的目录结构:
foo/
__init__.py
db.py
database.db
main.py
现在,在中db.py
,我读取了数据库的内容:
open('database.db').read()
只要我直接运行db.py,它就可以工作。但是,当我尝试foo
在main中导入包,然后运行db.py时,它失败,并出现文件未找到错误。
如何避免这种情况?(最好不对foo
软件包中的模块进行任何更改)
(注意:我知道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
因为根据文档,它似乎是默认设置,如果不需要该参数,则可以完全省略该参数。
如果可能的话,您不应该屏蔽(也许使用不同的名称,如- open_file()
),但是您似乎不想这样做。
尽管我仍然认为只有在没有其他解决方案的情况下才应进行屏蔽。另外,请注意,您不应导入db.py
为from db import *
,否则可能会open()
在.py
导入该文件的另一个文件中造成类似的遮罩(理想情况下,建议不要from <module> import *
在任何情况下进行该操作)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句