[英]Ambiguity of import modules in python
我有一个看起来像这样的Python库(包含软件包):
|-- python_lib/
|-- plotting.py
|-- verification.py
|-- io.py
|
|-- ensemble/
| -- plotting.py
| -- verification.py
但是,模棱两可的模块导入存在问题。 在ensemble.plotting.py
我想导入verification.py
从顶层(模块python_lib
):
# ensemble/plotting.py
import verification.obs as verobs
但是,我收到一个导入错误,因为它试图从ensemble目录(而不是库的顶层)中导入verification.py
模块。
我认为“绝对进口”功能可以解决此问题:
from ..verification import obs
但是我得到这个错误:
ValueError: Attempted relative import beyond toplevel package
如何在不尝试导入本地软件包版本的情况下,将python_lib/verification.py
为从python_lib/ensemble/*.py
导入?
我正在使用Python版本2.7。
您所有的目录都应包含__init__.py
文件,否则它们将不会被识别为软件包。
您的目录python_lib
必须是已知路径。 您在评论中说,您的PYTHONPATH
包含python_lib
的路径,因此似乎不错。
如果以python_lib/ensemble/verification.py
作为主要入口,那么目录python_lib/ensemble
目录python_lib
,并且您必须手动告诉Python您的脚本属于该软件包。
像这样:
if __name__ == "__main__" and __package__ is None:
__package__ = "pythonlib.ensemble"
import pythonlib
完成之后,这应该可以工作:
from ..verification import obs
这是一个哈克的解决方案,将工作,但一般不提倡。
当您必须省略冲突时,可以在适当位置修改python路径。 像那样:
import sys # needed to make it work
tmp = sys.path[0]
sys.path = sys.path[1:] # ugly and hacky thingy
# import stuff you need (would work with __init__.py in a base dir)
from python_lib import verification
from ..verification.obs import obs
# fix path back
sys.path.insert(0, tmp)
我刚刚测试了这种模式,它似乎可以工作(Python 3.6.0)
创建包和模块时必须遵循一些规则。
__init__.py
文件。 每个python包都应该有这个文件 提供了很好的文档Module-search-path
通常,在构建项目时,一种做法是创建一个lib包,并根据不同的类别添加子目录,并将主目录添加到PYTHONPATH变量中。 这使该模块可用于其他程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.