【问题标题】:Using pip to upgrade packages originally installed via apt使用 pip 升级最初通过 apt 安装的软件包
【发布时间】:2019-12-14 05:50:07
【问题描述】:

我想通过pip安装最新版本的docutils,但是不知道如何升级通过apt安装的系统版本。

$ sudo --set-home python2 -m pip install --upgrade docutils
Collecting docutils
  Using cached https://files.pythonhosted.org/packages/3a/dc/bf2b15d1fa15a6f7a9e77a61b74ecbbae7258558fcda8ffc9a6638a6b327/docutils-0.15.2-py2-none-any.whl
Installing collected packages: docutils
  Found existing installation: docutils 0.14
ERROR: Cannot uninstall 'docutils'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

$ apt-cache show python-docutils | head -n 3
Package: python-docutils
Architecture: all
Version: 0.14+dfsg-3

我没有想到或在网络上找到的解决方案:

  1. 使用rm -rf /usr/lib/python2.7/dist-packages/docutils* 删除apt 版本。这会使pip 沉默,但意味着:

    • 系统上安装的文件不再符合 Debian 打包系统的想法
    • 我可能会破坏系统软件对 docutils 0.14 的依赖关系
    • 对 Debian 软件包的任何更新都会导致 apt 重新安装
    • this answer 中讨论的其他问题
  2. pip install --force-reinstall。 (同样的问题。)

  3. pip install --ignore-install。 (同样的问题。)

有没有办法让默认环境适用于pip 的最新版本的东西,但不会破坏任何系统软件? The same answer above 建议使用virtualenvvenvpyenvpipenv 之一。我试过pipenv,它不想使用--system安装命令行中列出的单个包,我不知道创建Pipfile是否真的能解决这个问题。

我宁愿不用手动切换环境来使用apt-installed 包而不是pip-installed 包。有没有办法让 apt 安装的软件只使用一个环境,否则将环境与 pip 安装的东西一起使用?

【问题讨论】:

  • apt 安装的版本很可能被其他应用使用,或者更糟糕的系统,您应该尝试修改此安装。好的做法是并行拥有多个版本,这应该使用 virtualenv 或等效的来完成。注意:pip install --user docutils 可能有效,但我建议使用 virtualenv。

标签: python linux pip debian apt


【解决方案1】:

我宁愿不必以某种方式手动切换环境来使用 apt-installed 包而不是 pip-installed 包。有没有办法只让安装了 apt 的软件使用一个环境,否则将环境与 pip 安装的东西一起使用?

理想情况下,应该使用系统版本 pip 版本。

根据Debian Python Policy

只要不在路径中安装其他版本的 Python,Debian 的 Python 版本就不会受到新版本的影响。

如果您安装已安装的 Python 版本的不同微版本,则需要小心安装用于该 Python 版本的所有模块。

【讨论】:

    【解决方案2】:

    到目前为止,将以下内容添加到 ~/.bashrc 似乎效果很好:

    if [ ! -d ~/venv/python3 ]; then
        python3 -m venv --system-site-packages ~/venv/python3
    fi
    
    if [ -d ~/venv/python3 ]; then
        VIRTUAL_ENV_DISABLE_PROMPT=1 . ~/venv/python3/bin/activate
    fi
    

    大多数系统安装的脚本都硬编码了/usr/bin 中的一个Python,而不是使用/usr/bin/env python,因此它们不受此影响。

    【讨论】:

    • 使用虚拟环境是正确的方式。我觉得它有点笨拙,但它仍然有效。我已经开始为一次性脚本使用“默认”系统范围的 venv,并为每个更大、更结构化的应用程序创建特定于应用程序的 venv。
    猜你喜欢
    • 2019-04-09
    • 2014-01-16
    • 2011-10-16
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多