我有一个看起来像这样的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
模块,而不是从库的顶层导入。
我认为“abslute进口”功能可以解决这个问题:
from ..verification import obs
但是我收到了这个错误:
ValueError: Attempted relative import beyond toplevel package
如何在不尝试导入本地软件包版本的情况下将python_lib/verification.py
作为python_lib/ensemble/*.py
导入进行定位?
我使用的是Python 2.7版。
答案 0 :(得分:1)
您的所有目录都应包含__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
答案 1 :(得分:0)
这是一个可行的 hacky 解决方案,但通常不鼓励。
当您必须省略冲突时,可以修改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)
答案 2 :(得分:0)
创建包和模块时必须遵循一些规则。
__init__.py
文件作为您的包的一部分。每个python包都应该有这个文件提供了非常好的文档Module-search-path
通常在构建项目时,需要创建一个lib包并根据不同的类别添加子目录,并将主目录添加到PYTHONPATH变量中。这使该模块可用于其他程序。