首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不破坏其他包的情况下声明构建时依赖关系?

如何在不破坏其他包的情况下声明构建时依赖关系?
EN

Stack Overflow用户
提问于 2015-01-15 20:24:01
回答 1查看 2.5K关注 0票数 8

在安装依赖于python-daemon的软件包时,我遇到了一个问题。我最终将其追溯到昨天发布的python-daemon (2.0.3)软件包的最新版本。在Ubuntu14.04机器上的虚拟环境中进行测试,并发出以下命令:

代码语言:javascript
复制
(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安装,这给了我相同的回溯:

代码语言:javascript
复制
 ...
 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,现在可以安装好了。有没有其他人遇到过这个或类似的不同项目?我的解决方案是安装以前的版本。

代码语言:javascript
复制
(venv) $ pip install python-daemon==2.0.2
... works ...

但我想知道是什么导致了这样的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-20 22:23:10

(这种行为在python版本2.0.4及更高版本中得到纠正。)

这有两个方面:

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

更详细的解释:在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包装管理局论坛向我解释了这一点。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27972349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档