使用easy_install安装鸡蛋后,导入模块时出现ImportError

时间:2017-05-10 12:05:33

标签: python python-2.7 easy-install cpython egg

我们生成2个以egg文件形式分发的Python应用程序。我们已经在Python 2.5.4下生产了它们多年,但是现在它们正在将它们都提升到2.7.13。在这个过程中,2个应用程序中的1个现在在2.7.13上安装后表现出奇怪的行为。

当我easy_install.exe鸡蛋时,它似乎在各方面都很成功,我知道如何看。但是,当我尝试在Python命令行导入模块时,我得到一个ImportError。

这个问题有很多奇怪的事情:

  • 这只发生在Windows上 - 两个应用程序在Linux上安装并运行正常
  • 这只发生在我们的两个程序中的一个 - 另一个在任何地方运行良好
  • easy_install在Windows上有问题的安装过程中抱怨
  • 当我执行“import sys / print sys.path”时, 出现在路径中
  • egg 出现在site_packages
  • 的pth包列表中
  • 我正在以Windows管理员身份进行整个安装和测试,因此我认为不存在权限问题
  • 从2.5到2.7时,我们没有对任何一个程序的源代码或setup.py进行任何更改
  • 没有任何关于安装的想法 - 没有虚拟环境,只是全局安装到site_packages

这是失败的蛋的setup.py(模块名称更改为foo以保护无辜者):

from setuptools import setup

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

这是工作 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中给出的答案。

1 个答案:

答案 0 :(得分:0)

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

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