安装依赖于python-daemon
的软件包时遇到问题。我最终将其追溯到昨天发布的软件包python-daemon
(2.0.3)的最新版本。在Ubuntu 14.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
如果我再次使用pip卸载python-daemon并安装了未安装的软件包,则可以正常安装。还有其他人遇到过其他项目或与此类似的项目吗?我的解决方案是pip安装以前的版本
(venv) $ pip install python-daemon==2.0.2
... works ...
但想知道是什么原因导致这种错误。
最佳答案
(在python-daemon 2.0.4及更高版本中,此行为已得到纠正。)
这有两个方面:
更详细的说明:python-daemon构建过程中涉及到一些使用Docutils的复杂代码,这些代码在安装后不需要,也不是库代码的一部分。
它太复杂了,无法保留不可导入(因此不可进行单元测试)的
setup.py
,因此将构建代码分流到一个单独的可测试模块version
(在version.py
文件中),该模块本身使用Docutils。但是,然后
setup.py
具有循环依赖项:当尚未安装Docutils时,如何导入version
?如何使用Setuptools来确保已安装Docutils,运行setup.py
时需要version
才能完成?所有可行的解决方案都是丑陋且令人困惑的。在python-daemon 2.0.3中采用的方法是声明设置所需的Docutils,并为需要
version
的工作声明Setuptools entry point。这样setup.py
可以在将使用version
的任何入口点之前安装Docutils。但是,现在我们谈到了第一点,即Setuptools自夸为一切的中心。通过声明一个入口点,
setup.py
此后修改了每个Setuptools操作,如果每个软件包都找不到入口点,它将失败。而且,由于大多数模块在该模块中没有version
或指定的功能,因此它们会使Setuptools崩溃。本质上是要修复的错误,揭示了Setuptools中一个难以理解的极端情况。所以我投票赞成你的问题。
似乎没有一个好的解决方案:使模块可用于
setup.py
,但要确保首先满足要求。 Setuptools假定它是满足所有要求的所有依赖关系的唯一构建系统,并且当该假设失败时,很难解决。感谢Python Packaging Authority乡亲和
distutils-sig
forum向我解释这一点。关于python - 如何在不破坏其他程序包的情况下声明构建时依赖关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27972349/