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

晕眩的

我有一个看起来像这样的目录结构:

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模块时,会发生这种情况。显然,进行这么多更改不是很方便。

阿南德·库玛(Anand S Kumar)

一种解决方案是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.pyfrom db import *,否则可能会open().py导入文件的另一个文件中造成类似的遮罩(理想情况下,建议不要from <module> import *在任何情况下进行该操作)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章