Python:模块

时间:2015-08-05 10:14:15

标签: python

我有一个如下所示的目录结构:

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

2 个答案:

答案 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