使用 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.
这个问题有很多奇怪的地方:
- 这只发生在 Windows -- 两个应用程序安装并且 运行 在 Linux
上正常
- 这只发生在我们的 2 个程序中的 1 个中 -- 另一个 运行到处都很好
- easy_install 在 Windows
上有问题的安装过程中 没有 抱怨
- 当我"import sys / print sys.path"
时,鸡蛋确实出现在路径中
- egg 确实出现在site_packages
的pth包列表中
- 我正在以 Windows 管理员的身份进行整个安装和测试,所以我不认为可能存在权限问题
- 从 2.5 到 2.7
时,我们没有对任一程序的源代码或 setup.py 进行任何更改
- 安装没什么特别的——没有虚拟环境,只是全局安装到 site_packages
这是失败 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 总是正确地构建和导入。
我们制作了 2 个 Python 应用程序,这些应用程序作为 egg 文件分发。我们多年来一直在 Python 2.5.4 下制作它们,但现在正在将它们都升级到 2.7.13。在此过程中,2 个应用程序中的 1 个现在在 2.7.13 上安装后表现出奇怪的行为。
当我 easy_install.exe 鸡蛋时,它似乎在我所知道的各个方面都很成功。但是,当我尝试在 Python 命令行中导入模块时,出现 ImportError.
这个问题有很多奇怪的地方:
- 这只发生在 Windows -- 两个应用程序安装并且 运行 在 Linux 上正常
- 这只发生在我们的 2 个程序中的 1 个中 -- 另一个 运行到处都很好
- easy_install 在 Windows 上有问题的安装过程中 没有 抱怨
- 当我"import sys / print sys.path" 时,鸡蛋确实出现在路径中
- egg 确实出现在site_packages 的pth包列表中
- 我正在以 Windows 管理员的身份进行整个安装和测试,所以我不认为可能存在权限问题
- 从 2.5 到 2.7 时,我们没有对任一程序的源代码或 setup.py 进行任何更改
- 安装没什么特别的——没有虚拟环境,只是全局安装到 site_packages
这是失败 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 总是正确地构建和导入。