&引用;“正确的方法”;在archlinux上管理多个版本的Python

&引用;“正确的方法”;在archlinux上管理多个版本的Python,python,python-3.x,archlinux,Python,Python 3.x,Archlinux,所以我读过这篇—— 从这个wiki可以清楚地看到,我可以通过 pacman -S python2 我创建到python2的符号链接合理吗 ln -s python2 /usr/bin/python 如果我不希望自己很快切换到python 3.0?或者有没有更好的方法来管理多个python版本,就像我通常在debian系统(更新替代方案——配置python)或MacOSX系统(python选择)上使用的那样 澄清: 我想了解的是——在archlinux系统上管理各种python版本的“最佳实

所以我读过这篇——

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

pacman -S python2
我创建到python2的符号链接合理吗

ln -s python2 /usr/bin/python
如果我不希望自己很快切换到python 3.0?或者有没有更好的方法来管理多个python版本,就像我通常在debian系统(更新替代方案——配置python)或MacOSX系统(python选择)上使用的那样

澄清:

  • 我想了解的是——在archlinux系统上管理各种python版本的“最佳实践”是什么
  • 我不熟悉archlinux,但熟悉ubuntu、debian和MacOSX

不,没有更好的方法可以做到这一点。
python
symlink是python3包的一部分


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

大多数Unice已经有了a/usr/bin/python。覆盖该版本是个坏主意,因为系统中的所有包都使用Python版本,更改该版本可能会破坏它们。在安装python2.7包时,可执行文件应安装为/usr/bin/python2.7(如果不是,我会声明Archlinux已损坏),最好在运行python2.7时使用它

Archlinux有点特别,因为它将在python3中使用/usr/bin/python,尽管python3的默认可执行文件名是/usr/bin/python3。这令人困惑,可能被视为一个bug,但它确实意味着您不能将该符号链接用于Python2,因为任何其他使用Python3的Archlinux脚本如果使用,几乎肯定会崩溃


因此,在其他Unice上,将/usr/bin/python符号链接到Python2.7是一个坏主意,而在Archlinux上则是一个糟糕的主意。相反,只需安装您需要的所有版本,并使用/usr/bin/pythonX.X调用它们。

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

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

#!/usr/bin/env python2
如果脚本需要python3,请使用:

#!/usr/bin/env python3

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

github上有一个很好的项目,它叫
是什么帮助您管理多个python实例

我刚刚无意中读到了这篇文章,没有necro Bump的意图,但我想知道没有人提到VirtualNVS。我也在使用ArchLinux,我使用python包并创建多个python环境。您可以参考/usr/bin/中的python 2或python 3二进制文件来确定虚拟环境中使用的python版本


好处是,安装在虚拟环境中的软件包不会干扰系统使用的python,而且有许多方法可以自动化项目处理。

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

# pacman -S python2-virtualenv
然后创建一个使用Python 2的虚拟环境(这将自动在环境中安装Python、setuptools、wheel和pip):

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

现在,在您的
~/.bash_配置文件
~/.profile
(或您首选的shell配置文件)中,设置如下内容:\

source ~/env/bin/activate
这将激活虚拟环境,使您的默认版本为Python 2

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

deactivate

或者只是手动运行Python 3。

我知道这可能是一个非常古老的答案,但我花了两天时间解决了这个问题,所以我将与大家分享

在系统中管理python版本以在不同的项目上工作而不会让您发疯的正确方法是使用及其插件,正如Henrique Bastos所述。请注意,这种工作方式有点独立于平台,因为pyenv是一个python包,可以在Windows、Linux和macosx上运行

问题始于ArchLinux。操作系统不提供pyenv的pacman版本,因此您必须按照中所述从github克隆它来安装它。pyenv virtualenv和pyenv virtualenvwrapper的安装过程相同。请注意,shell初始化配置可能不同,在我的例子中,它不适用于~/.bash_概要文件,但适用于~/.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
我解决问题的方法是添加标志,如中所述:该解决方案最终使我安装了我想要的python版本:

LDFLAGS="-L/usr/lib/openssl-1.0" \
CFLAGS="-I/usr/include/openssl-1.0" \
pyenv install -v 3.4.3
为了避免每次更新python安装环境时都进入FAQ页面,可以在~/.bashrc或任何shell中添加别名,如下所示:

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