同一包中的绝对导入模块
问题内容:
我已经将导入问题简化为这个简单的基本案例。说我有一个Python包:
mypkg/
__init__.py
a.py
b.py
a.py包含:
def echo(msg):
return msg
b.py包含:
from mypkg import a # possibility 1, doesn't work
#import a # possibility 2, works
#from mypkg.a import echo # import also fails
print(a.echo())
在Python 2.7.6和Python 3.3.5上都可以运行python b.py
产生ImportError: No module named mypkg
。我也尝试过from __future__ import absolute_import
在两种情况下添加相同的问题。
预期:
我希望可能性1可以正常工作。
我为什么要这样做:
可能性2不太理想。假设地,标准库可能会引入一个名为的包a
(在这种情况下不太可能,但您可以理解)。当Python
2首先搜索当前软件包时,Python
3+包含绝对导入更改,因此将首先检查标准库。不管我出于什么原因,可能性1都应该起作用,不是吗?我可以发誓我已经做过数千遍了。
注意:如果您在外部编写脚本mypkg
,则from mypkg import a
可以正常使用。
我的问题类似于python-
在同一目录中模块的绝对导入,但是作者暗示我应该使用的工作。
问题答案:
from mypkg import a
是正确的形式。不要在Python软件包目录中运行脚本,它会使用多个名称使同一模块可用,这可能会导致错误。python -m mypkg.b
从包含的目录中运行mypkg
。
为了能够从任何目录运行,mypkg
应该位于pythonpath中。