【问题标题】:"Proper way" to manage multiple versions of Python on archlinux在archlinux上管理多个Python版本的“正确方法”
【发布时间】:2011-09-04 02:37:08
【问题描述】:

所以我读过这个 - https://wiki.archlinux.org/index.php/Python

从这个 wiki 可以清楚地看出,我可以通过

安装 Python 2.7.2
pacman -S python2

我创建一个指向 python2 的符号链接是否合理

ln -s python2 /usr/bin/python

如果我不认为自己很快就会切换到 python 3.0?或者有没有更好的方法来管理多个 python 版本,就像我通常在 debian 系统 (update-alternatives --config python) 或 mac os x 系统 (python select) 上使用的那样?

澄清:

  • 我想知道的是 - 在 archlinux 系统上管理各种 python 版本的“最佳实践”是什么?
  • 我是archlinux新手,但熟悉ubuntu、debian和mac os x

【问题讨论】:

    标签: python python-3.x archlinux


    【解决方案1】:

    我只是偶然发现了这篇文章,并没有打算讨论 necro-bumping,但我想知道没有人提到 virtualenvs。我也在使用 ArchLinux,我使用 python 包 virtualenvvirtualenvwrapper 来创建多个 python 环境。您可以参考 /usr/bin/ 中的 python 2 或 python3 二进制文件来确定虚拟环境中使用的 python 版本。

    好处是安装在虚拟环境中的包不会与系统正在使用的python混淆,并且有很多方法可以自动化项目处理。

    【讨论】:

      【解决方案2】:

      在 github 上有一个很好的项目,它可以帮助你完成它,叫做 pyenv 什么可以帮助您管理多个 python 实例

      【讨论】:

      • 你能解释一下它是如何工作的以及如何在arch linux上正确使用它吗?
      • 我认为最好的方法是!你按照安装方法github.com/yyuu/pyenv#installation
      【解决方案3】:

      大多数 unice 已经有了 /usr/bin/python。覆盖那个是一个坏主意,因为这是系统中所有包使用的 Python 版本,并且更改那个可能会破坏它们。安装 Python 2.7 包时,可执行文件应安装为 /usr/bin/python2.7(如果不是,我会声称 Archlinux 已损坏),当您想运行 Python 2.7 时最好使用它。

      Archlinux 有点特殊,因为 Python 3 将使用 /usr/bin/python,尽管 Python 3 的默认可执行文件名称是 /usr/bin/python3。这很令人困惑,可以看作是一个错误,但这确实意味着您不能在 Python 2 中使用该符号链接,因为如果您这样做,任何其他使用 Python 3 的 Archlinux 脚本几乎肯定会中断。

      所以在其他 Unices 上,将 /usr/bin/python 符号链接到 Python 2.7 是一个坏主意,在 Archlinux 上这是一个糟糕的主意。相反,只需安装您需要的所有版本并使用 /usr/bin/pythonX.X 调用它们。

      【讨论】:

      • 我使用的是archlinux的最小安装,所以它几乎是从头开始。
      • 不,没有其他(官方)包包含 /usr/bin/python 符号链接,因为当您尝试安装这两个包时会导致冲突。
      • @Julian “没有其他”?有问题的包不包含该符号链接。合理地,其他一些包可能包含它。
      • @calvinx:我很惊讶 Python 包在这种情况下没有安装该符号链接本身。在任何情况下,Python 2.7 都应该安装为 /usr/bin/python2.7。如果没有 /usr/bin/python 符号链接,你可以创建一个到 /usr/bin/python2.7 没有任何问题。
      • 我不喜欢这个答案,the PEP 很清楚 - python2 是 2.x 的某个版本,python3 是 3.x 的某个版本,python 会给你 2 或 3,不保证。 Arch 完美地遵循了 Python 的约定,绝对不是 bug。
      【解决方案4】:

      我认为您根本不应该创建任何这样的符号链接。特别是如果您要分发一些 python 代码,您不应该假设用户在 /usr/bin/python 中拥有 python2 或 python3。

      如果您的脚本需要 python2,只需使用:

      #!/usr/bin/env python2
      

      如果您的脚本需要 python3,请使用:

      #!/usr/bin/env python3
      

      这样,即使通过 Python 更新,您的脚本也能正常工作。您的脚本实际需要的版本也会更加清晰。

      【讨论】:

      • 注意,除了archlinux不叫python2,在archlinux上也不叫python3。 ;-) 可执行脚本通常需要安装类似 distutils 或类似的东西,但您可以使用您希望安装它的 python 解释器运行这些脚本。
      • (其实指定python2.6或者python3.2一般是个好主意,避免archlinux的问题)。
      • @Lennart:是的,它被称为 python3。 pacman -Qo /usr/bin/python3 : /usr/bin/python3 is owned by python 3.2.1-1.
      • 好的,很好,他们有 python3 以及只有 python。尽管如此,/usr/bin/python2 在 archlinux 之外是不寻常的。
      • 这里有很多错误信息,这个答案是完全正确的。 PEP-394 很清楚。所有类 unix 系统都应将 python2 指向 2.x 版本,python3 指向 3.x 版本,python 指向它们中的任何一个,由发行版自行决定。 Arch 是一个最前沿的发行版,它完美地遵循了 PEP。
      【解决方案5】:

      正如其他人所说,简短的回答是“不要这样做,它很可能会破坏你的系统”,但是,如果你主要使用 Python 2,你仍然可以在你的 shell 中设置你的个人默认值(并且仍然可以随时切换到 Python 3)。为此,首先成为 root 并安装python2-virtualenv

      # pacman -S python2-virtualenv
      

      然后创建一个使用 Python 2 的虚拟环境(这会在环境中自动安装 Python、setuptools、wheel 和 pip):

      $ virtualenv -p /usr/bin/python2 --system-site-packages ~/env # (Or wherever you want your environment to live)
      

      如果您只想使用本地安装的软件包(例如,您使用 pip 安装的软件包,而不是 pacman 安装的软件包),请在创建环境时删除 --system-site-packages 选项。

      现在在您的 ~/.bash_profile~/.profile(或任何您喜欢的 shell 配置文件)中,设置如下内容:\

      source ~/env/bin/activate
      

      这将激活虚拟环境,使您的默认版本为 Python 2。

      这仍然可能会破坏在 shell 中启动的任何内容,但除非您从 shell 显式运行它,否则不太可能会破坏任何内容,此时您可以通过运行关闭虚拟环境:

      deactivate
      

      或者干脆手动运行 Python 3。

      【讨论】:

        【解决方案6】:

        我知道这可能是一个很老的答案,但我花了两天时间才解决这个问题,所以我要分享一下。

        正确在您的系统中管理 python 版本以处理不同项目而不会让您发疯的方法是使用 pyenv 及其插件 pyenv-virtualenvpyenv-virtualenvwrapper,如 Henrique 所述巴斯托斯进入this blog post。请注意,这种工作方式与平台无关有点,因为 pyenv 是一个 python 包,它可以在 Windows、Linux 和 Mac OSx 上非常相似地运行。

        问题始于 Arch Linux。操作系统不提供 pyenv 的 pacman 版本,因此您必须按照installation section of the release 中所述从 github 克隆它来安装它。 pyenv-virtualenv 和 pyenv-virtualenvwrapper 的安装过程相同。请注意,shell 初始化配置可能不同,在我的情况下,它不适用于 ~/.bash_profile,但适用于 ~/.bashrc。

        如果您的安装像我最近设置的那样非常新鲜,那么运行 pyenv 并不简单,因为 pip 需要 openSSL,即使您通过 pacman 安装它,pyenv 也看不到它。所以,如果你想安装旧版本的 Python(即 3.4.3),你会发现 shell 抱怨你没有安装 openSSL 插件,即使你有它。老实说,我第一次尝试安装时没有正确的软件包;您必须下载以下软件包

        sudo pacman -S openssl
        sudo pacman -S openssl-1.0
        sudo pacman -S python-pyopenssl
        sudo pacman -S python2-pyopenssl
        

        我解决问题的方法是添加 pyenv installation FAQs 中描述的标志:该解决方案最终导致我安装了我想要的 python 版本:

        LDFLAGS="-L/usr/lib/openssl-1.0" \
        CFLAGS="-I/usr/include/openssl-1.0" \
        pyenv install -v 3.4.3
        

        为避免每次更新 python 安装环境时都进入常见问题页面,您可以在 ~/.bashrc 或任何您的 shell 中添加别名,如下所示:

        echo alias pyenv='LDFLAGS="-L/usr/lib/openssl-1.0" \
            CFLAGS="-I/usr/include/openssl-1.0" \
            pyenv' >> ~/.bashrc
        

        通过这种方式,您可以使用干净的 pyenv 语法正确安装 python,并以相同的方式通过其插件管理它(因为语法是 pyenv [COMMAND] [OTHERSTUFF])。

        【讨论】:

          【解决方案7】:

          不,没有更好的方法可以做到这一点。 python 符号链接是 Python 3 包的一部分。

          我想更改此链接暂时不会破坏任何内容,但将来某些软件包可能会依赖它。

          【讨论】: