安装依赖于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似乎可以正常工作,但是某些内容会影响pipsetuptools,因为其他软件包(celeryflask),在给了我相同的回溯之后,我尝试使用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及更高版本中,此行为已得到纠正。)

这有两个方面:

  • Setuptools假定它是一切的中心。
  • python-daemon的2.0.3版本没有考虑到这一点。

  • 更详细的说明: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/

    10-16 23:27
    查看更多