如何在Ubuntu上设置和使用虚拟Python环境?

Python虚拟环境用于创建独立的Python环境,以避免依赖和版本冲突,并间接解决权限问题。但在Ubuntu中,设置和使用Python虚拟环境的最简单方法是什么?
4个回答

通过virtualenvwrapper(对virtualenv功能的用户友好封装)

安装 virtualenv

使用以下命令安装virtualenv

sudo apt install virtualenv

安装virtualenvwrapper

我们安装virtualenvwrapper的原因是它提供了简单易用的命令来管理您的虚拟环境。有两种方法可以安装virtualenvwrapper

作为Ubuntu软件包(适用于Ubuntu 16.04及以上版本)

运行以下命令:

sudo apt install virtualenvwrapper

然后运行
echo "source /usr/share/virtualenvwrapper/virtualenvwrapper.sh" >> ~/.bashrc

使用pip
  1. 安装和/或更新pip

    使用以下命令为Python 2安装pip:

    sudo apt install python-pip
    

    或者对于Python 3:

    sudo apt install python3-pip
    

    (如果您使用的是Python 3,在本指南的其余部分中可能需要使用pip3而不是pip)。

    可选(但建议):打开bash自动补全功能

    运行以下命令:

    pip completion --bash >> ~/.bashrc
    

    然后运行source ~/.bashrc以启用。

  2. 安装virtualenvwrapper

    因为我们想避免使用sudo pip,我们使用以下命令在本地安装virtualenvwrapper(默认安装在~/.local目录下):

    pip install --user virtualenvwrapper
    

    并且

    echo "export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3" >> ~/.bashrc
    
  3. .bashrc文件中添加virtualenvwrapper源码

    echo "source ~/.local/bin/virtualenvwrapper.sh" >> ~/.bashrc
    

设置 virtualenv 和 virtualenvwrapper:

首先,我们导出包含虚拟环境存储目录的 WORKON_HOME 变量。让我们将其设置为 ~/.virtualenvs

export WORKON_HOME=~/.virtualenvs

现在还要创建这个目录
mkdir $WORKON_HOME

将此导出放入我们的~/.bashrc文件中,这样变量就会自动定义。
echo "export WORKON_HOME=$WORKON_HOME" >> ~/.bashrc

我们还可以添加一些额外的技巧,例如以下操作,确保如果pip创建了一个额外的虚拟环境,它也会被放置在我们的WORKON_HOME目录中:
echo "export PIP_VIRTUALENV_BASE=$WORKON_HOME" >> ~/.bashrc 

在终端中输入"source ~/.bashrc"来加载更改。
source ~/.bashrc

测试是否正常工作

现在我们创建我们的第一个虚拟环境。 -p 参数是可选的,它用于设置要使用的Python版本;例如,它也可以是python3

mkvirtualenv -p python2.7 test

你会看到环境已经设置好了,你的提示现在包括了你活动环境的名称(用括号括起来)。如果你现在运行
python -c "import sys; print sys.path"

你应该看到很多/home/user/.virtualenv/...,因为它现在不再使用你系统的site-packages。
你可以通过运行来停用你的环境。
deactivate

如果你想再次处理它,只需输入
workon test

最后,如果你想删除你的环境,请输入
rmvirtualenv test

享受吧!


感谢这篇博客文章的作者。

2python-pippython-virtualenv可以通过Ubuntu软件仓库进行安装,无需手动安装。 - Timo
2然而,在Ubuntu中,我们推荐使用Ubuntu软件包,有很多原因。旧版本的pip或virtualenv并没有问题,它们完全能够胜任。 - tumbleweed
1@GerhardBurger:如果你创建一个python3的虚拟环境,它将会得到一个适用于python3的pip。如果你使用Ubuntu的virtualenv来创建虚拟环境,那么你所做的一切都将被包含在虚拟环境中。如果你开始使用sudo easy_install安装软件,它将会在/usr/local目录下留下一堆难以清理的混乱,而且收益甚微。 - tumbleweed
看起来现在不需要使用别名了:--no-site-packages 是默认设置,而 --distribute 已经被弃用。 - int_ua
如果 mkvirtualenv test 不起作用,请参考:http://stackoverflow.com/questions/15608236/eclipse-and-google-app-engine-importerror-no-module-named-sysconfigdata-nd-u - Nikos Alexandris
我在这里读到,告诉人们使用sudo pip install的指令是本质上错误的。你对此有何看法? - floatingpurr
这是一个非常好的答案,但它只适用于Python2。你能否扩展它以包括Python3? - Luís de Sousa
不再需要sudo pip了,现在每个人都应该很开心 ;) - Gerhard Burger
@GerhardBurger 看起来~/.local/bin/virtualenvwrapper.sh中硬编码了/usr/bin/python,所以你的指令不能直接在python3上运行。你可以尝试使用pip3 install --user virtualenvwrapper - raphael
@raphael 谢谢你提醒!这不是硬编码的,但如果 VIRTUALENVWRAPPER_PYTHON 没有设置,它会执行 which python 命令,该命令将返回 /usr/bin/python,因为这是默认的 Python(https://www.python.org/dev/peps/pep-0394/)。你需要执行 export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 来使其正常工作,我会将此添加到说明中。 - Gerhard Burger
在步骤1和步骤2之间,您还可以使用pip install --user pip命令进行安装,以获取最新版本的pip作为用户安装。 - mkasberg
我认为在没有--user标志的情况下,pip install -U pip是错误的。(-U--upgrade--user没有短选项。)如果你不使用--user,它会干扰由apt管理的安装过程,可能会导致一些奇怪的状态,并且可能无法在没有sudo权限的情况下工作,就像你在第2步中提到的virtualenvwrapper一样。 - mkasberg
@mkasberg 你说得对,我本来希望pip能根据GitHub上的一些讨论自动解决这个问题。另外,如果你升级了pip,你需要在PATH中加入~/.local/bin,否则pip仍然会执行系统的pip。综合考虑,我觉得升级pip不值得额外的努力,所以我决定再次删除升级pip的指示。 - Gerhard Burger
路径/var/www/html/python/check/python3(来自--python=/var/www/html/python/check/python3)不存在。 - Saravanan Nandhan
我确认这适用于Ubuntu 20.04 LTS。许多其他教程都不起作用。谢谢,@GerhardBurger。 - Stefan_EOX

虚拟环境提供了一种按项目管理和隔离依赖项的方式。此外,它们还避免了整个“sudo pip install”情况,这是一个安全风险,我在https://askubuntu.com/a/802594/15003中已经解释过。Python官方文档也鼓励使用虚拟环境
创建和使用虚拟环境的最简单方法是使用apt或apt-get安装virtualenv,适用于Python 2和Python 3。对于每个Python项目,创建一个虚拟环境然后激活它。请注意,虚拟环境是特定于特定Python版本的。激活后,无论您使用Python 2还是3,都可以像往常一样使用pip安装Python包;不需要使用pip3来安装Python 3。sudo仅用于安装virtualenv,并且不与pip一起使用,从而避免了上述安全风险。执行此操作的命令如下:
sudo apt update
sudo apt install virtualenv
cd ~/desired_directory  # cd to desired_directory
virtualenv venv  # create virtualenv named venv for default system Python, which is Python 2 for Ubuntu
source venv/bin/activate  # activate virtualenv
pip install -U pip  # upgrade pip in case it is outdated
pip install desired_package  # install desired_package

如果您想为Python 3创建一个虚拟环境,请将virtualenv venv替换为:
virtualenv venv -p python3

阅读有关virtualenv的各种花里胡哨的内容,请访问https://virtualenv.pypa.io/en/stable/

1source 让我省了很多指令 - MuntingInsekto
OSError:[Errno 40] 符号链接层级过多:'/var/www/html/python/check/venv/bin/python' - Saravanan Nandhan
@SaravananNandhan 请提出一个新问题,并附上必要的细节。 - edwinksl


在Python 3.3(和Ubuntu 15.10)中提供了venv模块

虚拟环境(venv)非常受欢迎,以至于现在已经包含在Python本身中(从3.3版本开始)。要在Ubuntu上使用它,您需要安装python3-venv(因为ensurepip模块不可用):

sudo apt-get install python3-venv

之后你可以使用
pyvenv myvirtualenv

创建一个名为myvirtualenv的虚拟环境。然后你可以使用它。
source myvirtualenv/bin/activate

激活虚拟环境。要停用,只需键入
deactivate

编辑: pyvenv 脚本已被废弃,推荐使用 python3 -m venv。这样可以避免混淆,了解 pyvenv 连接到哪个 Python 解释器,从而确定虚拟环境将使用哪个 Python 解释器。(source