同包绝对导入模块

2024-05-04 19:49:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经将导入问题简化为这个简单的基本情况。假设我有一个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,但作者暗示我所拥有的应该是有用的。


Tags: frompyimportecho标准returninitdef
3条回答

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

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

我认为问题来自于这样一个事实,即您没有对mypkg文件夹中的mypkg的引用。当我尝试运行您的示例时(使用verbose选项),看看Python正在做什么:

# trying /vagrant/mypkg/mypkg.py

这就是为什么它能找到模块,因为它不存在。你可以做的一件事是用一个名为mypkg.py的文件

import a

但这只是你穿上另一件夹克的第二种可能性。在不知道您想要完成什么的情况下,我将选择Intra-package Reference文本上的第一个示例。我会这样写:

from a import echo

print(echo('message'))

试试这个:

import sys
import os
this_dir = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.dirname(this_dir))

from mypkg import a
print(a.echo())

相关问题 更多 >