我在安装依赖的软件包时遇到了问题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)
Run Code Online (Sandbox Code Playgroud)
所以安装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
Run Code Online (Sandbox Code Playgroud)
如果我再次使用pip移除python-daemon,那么现在没有安装的软件包安装正常.有没有其他人遇到这个或类似的不同项目?我的解决方案是pip安装以前的版本
(venv) $ pip install python-daemon==2.0.2
... works ...
Run Code Online (Sandbox Code Playgroud)
但是想知道可能导致这样的错误的原因.
(此行为在 python-daemon 版本 2.0.4 及更高版本中已得到纠正。)
\n\n这有两个方面:
\n\n更详细的解释: python-daemon构建中涉及一些使用 Docutils 的复杂代码,安装后不需要,也不是库代码的一部分。
\n\n它太复杂了,无法保留不可导入的(因此不可单元测试的)setup.py,因此构建代码被分流到一个单独的可测试模块version(在文件中version.py),该模块本身使用 Docutils。
但这样就有了一个循环依赖:当 Docutils 尚未安装时,setup.py如何导入?version如何使用Setuptools来确保Docutils已安装,运行setup.py完成时需要version?所有可行的解决方案都是丑陋且令人困惑的。
\xe2\x80\x98python-daemon\xe2\x80\x99 2.0.3 中采用的方法是声明安装所需的 Docutils,并为需要的工作声明一个Setuptools 入口点version。这样setup.py就可以在任何将使用 的入口点之前安装 Docutils version。
但现在我们谈到第一点,Setuptools 自诩为一切的中心。通过声明入口点,setup.py修改了此后的每个安装工具操作,并且如果找不到入口点,每个包都会失败。而且,由于他们中的大多数人都没有version指定的功能,因此它们会使安装工具崩溃。
本质上是一个需要修复的错误,揭示了安装工具中一个难以理解的极端情况。所以我对你的问题投了赞成票。
\n\n似乎没有一个好的解决方案:让模块可用于setup.py但首先确保满足要求。setuptools 假设它是满足所有事物的所有依赖关系所需的唯一构建系统,当该假设失败时,就很难绕过。
感谢Python 包装权威人员和distutils-sig论坛向我解释了这一点。