同一包中的绝对导入模块


问题内容

我已经将导入问题简化为这个简单的基本案例。说我有一个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中。