python - 同一包中的绝对导入模块

标签 python python-2.7 python-3.x import

我已将我的导入问题简化为这个简单的基本案例。假设我有一个 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 搜索 current package first 时, Python 3+ 包含绝对导入更改,以便首先检查标准库。 不管我的理由是什么,可能性 1 应该可行,不是吗?我可以发誓我以前做过数千次。

注意:如果您在 mypkg 外部编写脚本,from mypkg import a 可以正常工作。

我的问题类似于python - absolute import for module in the same directory ,但作者暗示我所拥有的应该有效。

最佳答案

from mypkg import a 是正确的形式。不要从 Python 包目录中运行脚本,它使同一个模块可以使用多个名称,这可能会导致错误。从包含 mypkg 的目录运行 python -m mypkg.b

为了能够从任何目录运行,mypkg 应该在 pythonpath 中。

关于python - 同一包中的绝对导入模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23536163/

相关文章:

python - 在 python/numpy 中切片时“环绕”

python - 如何逃避 os.system() 调用?

python - 在 Seaborn 中创建深色反转调色板

python - 向枚举添加属性

c - CType 问题 - 调用 C dll 函数

python : Extending Exception class

python - float 总和 : unexpected result

django信号模块对象没有属性connect

python - 如何在 python - Django 中从数据库获取列表到 html?

python - 沿第三维查找 xarray DataArray 的最高值。