使用 easy_install 安装一个 egg 后,导入模块时出现 ImportError

After using easy_install to install an egg, I get an ImportError when importing the module

我们制作了 2 个 Python 应用程序,这些应用程序作为 egg 文件分发。我们多年来一直在 Python 2.5.4 下制作它们,但现在正在将它们都升级到 2.7.13。在此过程中,2 个应用程序中的 1 个现在在 2.7.13 上安装后表现出奇怪的行为。

当我 easy_install.exe 鸡蛋时,它似乎在我所知道的各个方面都很成功。但是,当我尝试在 Python 命令行中导入模块时,出现 ImportError.

这个问题有很多奇怪的地方:

这是失败 egg 的setup.py(为了保护无辜者,模块名称改为foo):

from setuptools import setup

setup(name='foo',
      description='Foo Module',
      packages=['foo'],
      entry_points = {
        'console_scripts': [
            'foo = foo.foo:main',
            ],
        },
      )

这里是 working egg 的 setup.py:

from setuptools import setup

setup(name='bar',
      description='Bar Tool',
      packages=['bar', 'bar.hexes', 'bar.barlib'],
      entry_points = {
        'console_scripts': [
            'bar = bar.main:main',
            ],
       },
      )

由于在我尝试导入模块之前没有发现任何问题,我该如何调试这个问题?

我目前的主要怀疑是 setup.py 的 console_scripts 部分中的 foo.foo 引用。这听起来有点类似于@joest 在 this problem.

中给出的答案

无法导入foo模块,因为egg中没有__init__.py。由于我仍然不完全理解的原因,我们的 x64 构建机器在创建 egg 期间自动生成该文件(您将看到一条 Creating missing __init__.py for foo 消息),而 x86 构建机器跳过该步骤并生成一个破蛋。考虑到我们构建 Python 本身和所有必要的模块作为构建这个蛋的过程的一部分,我看不出行为会有什么不同,但确实如此。

我刚刚在 foo 源目录中创建了一个空白 __init__.py,现在 eggs 总是正确地构建和导入。