在安装依赖于python-daemon的软件包时,我遇到了一个问题。我最终将其追溯到昨天发布的python-daemon (2.0.3)软件包的最新版本。在Ubuntu14.04机器上的虚拟环境中进行测试,并发出以下命令:
(venv) $ pip list
argparse (1.2.1)
pip (1.5.6)
setuptools (3.6)
wsgiref (0.1.2)
(venv) $ pip install redis
... works fine ....
(venv) $ pip install python-daemon
...
snip
...
File "/home/pwj/.virtualenvs/venv/local/lib/python2.7/site-packages/pkg_resources.py", line 2147, in load
['__name__'])
ImportError: No module named version
(venv)02:15 PM tmp$ pip list
argparse (1.2.1)
lockfile (0.10.2)
pip (1.5.6)
python-daemon (2.0.3)
setuptools (3.6)
wsgiref (0.1.2)因此,python-daemon的安装似乎有效,但某些东西影响了pip或setuptools,因为其他软件包(celery、flask),在此之后,我尝试用pip安装,这给了我相同的回溯:
...
snip
...
File "/home/pwj/.virtualenvs/venv/local/lib/python2.7/site-packages/pkg_resources.py", line 2147, in load
['__name__'])
ImportError: No module named version如果我用python和没有安装的软件包卸载python,现在可以安装好了。有没有其他人遇到过这个或类似的不同项目?我的解决方案是安装以前的版本。
(venv) $ pip install python-daemon==2.0.2
... works ...但我想知道是什么导致了这样的错误。
发布于 2015-01-20 22:23:10
(这种行为在python版本2.0.4及更高版本中得到纠正。)
这有两个方面:
更详细的解释:在python构建过程中有一些使用Docutils的复杂代码,这在安装后不需要,也不是库代码的一部分。
它太复杂了,不能放在不可输入的(因此不是单元可测试的) setup.py中,因此构建代码被分流到单独的可测试模块version (在文件version.py中),该模块本身使用Docutils。
但是,setup.py有一个循环依赖关系:当Docutils尚未安装时,如何导入version?如何使用Setuptools来确保安装了Docutils,当运行setup.py以完成时将需要version?所有可行的解决办法都是丑陋和混乱的。
在‘python’2.0.3中采用的方法是声明安装所需的Docutils,并为需要version的工作声明一个version。这样,setup.py就可以在使用version的任何入口点之前安装Docutils。
但现在我们要讲到第一点,Setuptools傲慢地认为自己是一切事物的中心。通过声明一个入口点,setup.py随后修改了每个Setuptools操作,如果它找不到入口点,那么每个包都会失败。而且,由于它们中的大多数都没有version或该模块中指定的函数,所以它们会使Setuptools崩溃。
本质上是一个有待修复的bug,它揭示了Setuptools中一个难以理解的角落案例。所以我要对你的问题投赞成票。
这似乎没有一个很好的解决方案:拥有setup.py可用的模块,但首先要确保满足需求。Setuptools假定它是满足所有依赖关系所需的唯一构建系统,当这个假设失败时,很难绕过。
感谢Python包装管理局和论坛向我解释了这一点。
https://stackoverflow.com/questions/27972349
复制相似问题