pip install / pytz 版本冲突?

Posted

技术标签:

【中文标题】pip install / pytz 版本冲突?【英文标题】:pip install / pytz versioning conflict? 【发布时间】:2015-11-28 13:06:18 【问题描述】:

我在 Ubuntu 12.04 虚拟机上运行 pip install protobuf==2.6.1 作为项目 install 脚本的一部分。这会产生以下错误:

收集protobuf==2.6.1 /usr/local/lib/python2.7/dist-packages/pip-7.1.2-py2.7.egg/pip/_vendor/requests/packages/urllib3/util/ssl_.py:90:InsecurePlatformWarning:真正的 SSLContext对象不可用。这会阻止 urllib3 正确配置 SSL,并可能导致某些 SSL 连接失败。有关更多信息,请参阅 https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning。 不安全平台警告 下载 protobuf-2.6.1.tar.gz (188kB) 100% |################################| 188kB 2.5MB/秒 命令 python setup.py egg_info 的完整输出: 已安装 /tmp/pip-build-AnwMIr/protobuf/.eggs/google_apputils-0.4.2-py2.7.egg 回溯(最近一次通话最后): 文件“”,第 20 行,在 文件“/tmp/pip-build-AnwMIr/protobuf/setup.py”,第 200 行,在 "Protocol Buffers 是 Google 的数据交换格式。", 文件“/usr/lib/python2.7/distutils/core.py”,第 112 行,在设置中 _setup_distribution = dist = klass(attrs) 文件“/usr/local/lib/python2.7/dist-packages/setuptools/dist.py”,第 268 行,在 __init__ self.fetch_build_eggs(attrs['setup_requires']) 文件“/usr/local/lib/python2.7/dist-packages/setuptools/dist.py”,第 313 行,在 fetch_build_eggs replace_conflicting=真, 文件“/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py”,第 836 行,解决 dist = best[req.key] = env.best_match(req, ws, installer) 文件“/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py”,第 1074 行,在 best_match dist = working_set.find(req) 文件“/usr/local/lib/python2.7/dist-packages/pkg_resources/__init__.py”,第 711 行,在 find 引发 VersionConflict(dist, req) pkg_resources.VersionConflict: (pytz 2011k (/usr/lib/python2.7/dist-packages), Requirement.parse('pytz>=2010'))

使用pip install -r requirements.txt 会产生同样的错误。

我有pip 7.1.2,并且在其他 Ubuntu 12.04 VM 上拥有protobuf 2.6.1,它们的安装包列表类似(不完全相同)。 Pip freeze 说pytz===2011k。 (注意三元等于。)

pip-conflict-checker 只报告一个冲突,似乎与pytzprotobuf 都无关:

$ pipconflictchecker
--------------------------------------------------
 Conflicts Detected
--------------------------------------------------
 - python-dateutil(2.1) pandas(<2)

为什么 pip 将 pytz===2011kpytz&gt;=2010 标记为冲突?

我想在一个“requirements.txt”中列出我所有的 pip 要求。有没有办法在不触发上述错误的情况下做到这一点?我对pytz 本身没有明确、直接的要求。

我还能够使用显式的pip install 2012b0 来安装protobuf,但不能使用pip install -r requirements.txt 作为requirements.txt,同时带有protobuf==2.6.1pytz&gt;=2015

可能相关的链接:

已弃用的 pytz 版本控制解决方法:https://bugs.launchpad.net/pytz/+bug/1224858 简单的 VersionConflict 和 pip 冲突检查器示例:https://github.com/docker/compose/issues/918 PEP 440 / Python 版本控制https://www.python.org/dev/peps/pep-0440 包括pytz 版本https://www.python.org/dev/peps/pep-0440/#olson-database-versioning 的特别说明和'===' 的描述https://www.python.org/dev/peps/pep-0440/#arbitrary-equality pip 开发线程依赖检查/解析https://github.com/pypa/pip/issues/988

【问题讨论】:

【参考方案1】:

我希望有人提出更好的解决方案,但这可能需要等待 pip 提供真正的解决冲突工具,而不是目前的“默默地先找到任何东西”的方法。 (请参阅https://pip.pypa.io/en/stable/user_guide.html#requirements-files)由于 pip 明显无法解析 pytz 2011k 的版本号,特定问题可能也很复杂。 (我认为这就是“===”的含义,但我在 pip 的文档中没有找到明确的确认。)

与此同时,我似乎有两个选择:

在 requirements.txt 中明确指定 pytz 的版本 重新排列 requirements.txt 中依赖项的顺序

这两个选项都遇到相同的问题:除了以下之一之外,没有其他方法可以获取必要的数据([preferred version of pytz] 或 [preferred order]):

手动解析我的完整依赖树 反复试验

我建议将此“答案”作为自己和他人的占位符/指南/解决方法。我不认为它是“可接受的”,因为它很脆弱:如果我想让 pytz 保持最新,我必须监控他们的发布时间表,并可能在 pytz 发布更新或我发布更新时重复上述过程添加/删除涉及 pytz 的依赖项。

观看这个帖子,希望得到真正的解决方案:https://github.com/pypa/pip/issues/988

【讨论】:

【参考方案2】:

在我的 MAC EL-Capitan 上,我在使用 python 2.6 版时遇到了类似的错误,错误如下

bash# ./configure CXXFLAGS=-Wno-deprecated-declarations bash# make ... pkg_resources.VersionConflict: (putz 2012d (/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python), Requirement.parse('pytz>=2010')) make[2]: *** [../3rdparty/protobuf-2.6.1/python/dist/protobuf-2.6.1-py2.6.egg] Error 1 make[1]: *** [all] Error 2 make: *** [all-recursive] Error 1

解决方案

更改了 python 版本 > 2.6 似乎是 pytz 与 2.6 的版本兼容性问题

但是 python3.4 在使用 ./configure 脚本时失败 .checking whether python3.4 version &gt;= 2.6... configure: error: too old

所以我建议你坚持使用 python2.7bash# ./configure CXXFLAGS=-Wno-deprecated-declarations PYTHON_VERSION=2.7 bash# make

【讨论】:

以上是关于pip install / pytz 版本冲突?的主要内容,如果未能解决你的问题,请参考以下文章

easy_install 和 pip

easy_install与pip 区别

解决python3与python2的pip命令冲突问题冲突(window版)

python学习笔记--easy_install和pip

pip install出错,pip版本不匹配

pip/conda 安装库出现版本冲突问题