使用virtualenv与不同版本的Python

1709

我该如何为指定版本的Python创建虚拟环境?


12
提到你也可以使用virtualenvwrapper来完成这个操作。 - bias
21
值得注意的是,Python 3 中有一个内置的虚拟环境等效工具:venv - naught101
6
在当前环境中切换Python版本而不创建新的环境,是否有可能实现? - Charlie Parker
这个视频是virtualenv文档推荐的,它详细介绍了整个过程的步骤。 - AnandShiva
2
每当我在已创建的虚拟环境中使用sudo安装一些实用程序(如docker-compose)时,它会选择根Python和pip版本(3.6),而不是创建虚拟环境时使用的版本(3.7)。为什么会这样?但是当我在虚拟环境内运行python版本时,它会正确显示(3.7)。 - y_159
这对我有用:py -3.9 -m venv .venv - Paul Beloff
41个回答

1986

注意: 对于 Python 3.3+,请参见Aelfinn的下面的答案。


创建虚拟环境实例时,使用--python(或简写-p)选项指定您想要使用的Python可执行文件,例如:

virtualenv --python="/usr/bin/python2.6" "/path/to/new/virtualenv/"

178
我想提一下,这对于virtualenvwrappers也适用:mkvirtualenv -p python2.6 env。 - bias
104
我有点不理解 - 这难道不要求系统已经安装了2.6吗?我认为virtualenv的重点是我可以拥有一个版本的Python而不是主要的(在我的情况下,是CentOS上的2.4)。我以为我可以先安装virtualenv,然后在其中安装Python 2.6以供环境中的软件包使用? - John C
51
@John,是的,你说得对。但这不是virtualenv的重点所在:它的主要目的是为Python创建一个隔离的环境。你需要先安装那个版本 - 不过你可以为自己的用户本地安装它。 - Daniel Roseman
10
您可以使用 pythonbrew 安装其他版本的 Python。 - ashwoods
77
如果您有点懒惰:virtualenv -p \which python2.6` <新虚拟环境的路径>` - blaze
显示剩余15条评论

619
自 Python 3 开始,文档 建议使用以下方法创建虚拟环境:
python3 -m venv "my_env_name"

另外,如果我们想要安装特定版本的Python,比如3.6,则可以执行以下命令:

python3.6 -m venv "my_env_name"

请确保在您现有的系统python的基础上安装所引用的Python版本。例如,如果您系统中已安装的版本仅为python 3.8,则会遇到错误,指出“找不到命令'python3.6'”。

过时的信息

pyvenv脚本可用于创建虚拟环境:

pyvenv "/path/to/new/virtual/environment"

自Python 3.6起已被弃用。


17
感谢您指出这一点,需要更多推广。有一个小问题:现在他们建议使用python3 -m venv <envname>来运行它,以避免需要为所有内容编写存根脚本。 - Paul Everitt
7
实际上,在Python 3.6及以上版本中,pyvenv脚本已经被弃用,但底层的venv模块还没有。因此像@PaulEveritt所说的那样,使用python3 -m venv <myenvname>命令。 - RichVel
6
请注意,pyvenvpython3 -m venv ...不会安装python-config脚本。这意味着即使激活了Python3环境,系统级别的python-config也将被调用,可能会导致混乱的后果。请参见2011年的此错误报告https://github.com/pypa/virtualenv/issues/169和我的问题https://dev59.com/PlgQ5IYBdhLWcg3w6ISg?rq=1 - András Aszódi
46
确认 @Nick 的观察是正确的:创建一个指定 Python 版本的 venv 的方法是在设置它时使用该版本。例如:python3.5 -m venv venv - tanius
12
venv中使用不同的Python版本仍然是可能的。与virtualenv不同的是,您不需要提供参数,只需确保使用适当的Python版本来运行venv。例如,使用Python launcher pypy -3.3 -m venv my_venv将创建一个使用Python 3.3的虚拟环境。 - cowlinator
显示剩余8条评论

226

当您处于共享主机环境并需要从源代码安装和编译Python,然后创建venv时,可以按照以下步骤进行操作。 对于Python 2.7.9,您将执行类似以下步骤的操作:

mkdir ~/src
wget http://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz
tar -zxvf Python-2.7.9.tgz
cd Python-2.7.9
mkdir ~/.localpython
./configure --prefix=$HOME/.localpython
make
make install

虚拟环境

cd ~/src
wget https://pypi.python.org/packages/5c/79/5dae7494b9f5ed061cff9a8ab8d6e1f02db352f3facf907d9eb614fb80e9/virtualenv-15.0.2.tar.gz#md5=0ed59863994daf1292827ffdbba80a63
tar -zxvf virtualenv-15.0.2.tar.gz
cd virtualenv-15.0.2/
~/.localpython/bin/python setup.py install
virtualenv ve -p $HOME/.localpython/bin/python2.7
source ve/bin/activate   

当然,这适用于任何需要复制您工作和部署环境的情况。


5
为什么要这样做?为什么要本地安装Python?更重要的是,为什么要使用要与之配合使用的Python版本安装virtualenv? - lajarre
21
好的。如果你的服务器采用虚拟托管环境,并且提供的Python版本较旧,而你对此不满意——这是我的情况。另外,如果你在不同的服务器上开发项目,并且想要在本地机器上复制这些环境......Virtualenv会创建到Python库的硬链接。因此,使用哪个Python版本来安装和创建Virtualenv非常重要。 - zzart
9
如果你和我一样,在工作中使用被锁定的机器没有sudo权限。那么本地存储库、SQL数据库、各种编程语言和编译器就十分重要了!谢谢! - zachd1_618
6
在 virtualenv 1.9.1 中,我必须使用 ~/.localpython/bin/virtualenv 而不是仅使用 virtualenv 才能完成设置而不出现错误。此外,需使用 source ve/bin/activate 而不是 source activate - Saul
3
另一个这么做的原因是在主要发布之前尝试测试beta版本,以确保您的项目及其依赖项仍可正常工作,而不会冒险通过覆盖某些内容并留下悬空文件来破坏您的软件包管理。我喜欢这个答案。 - RobotHumans
显示剩余5条评论

213

有一种更简单的方法,

virtualenv venv --python=python2.7

感谢评论,但这仅在您已经在系统级(例如 /usr/bin/python2.7)安装了Python 2.7的情况下才有效。

否则,如果您使用Homebrew,则可以使用路径来获得所需内容。

virtualenv venv --python=/usr/local/bin/python

你可以使用 which python(Linux)或 py -0p(Windows)找到你的 Python 安装路径。

这也适用于 Python 3。

which python3
>> /usr/local/bin/python3
virtualenv venv --python=/usr/local/bin/python3

最终凝聚为:

virtualenv venv -p `which python`
virtualenv venv -p `which python3`

3
请注意,此代码仅在系统级别安装了Python2.7(例如/usr/bin/python2.7)时才能正常运行。 - kingb12
你其实可以忽略次要版本号。 virtualenv env --python=python2 - Anshul
谢谢。这个命令 virtualenv venv --python=python3.8 是有效的,但是我们需要下载 Python3.8 对吧?现在我有 Python3.9 和 Python3.8,所以我才问这个问题。 - Rohan Devaki
在Windows中,您可以使用“where python”而不是“which python”。 - Manoj D Bhat
最好在结尾部分使用$()语法,例如$(which python)。 - ᐅdevrimbaris
显示剩余5条评论

116
virtualenv --python=/usr/bin/python2.6 <path/to/myvirtualenv>

3
请看下面的答案,使用环境变量可以得到等效的解决方案。这种方法意味着您不必记得使用“-p”。 - Chris Johnson
6
有没有不需要创建新的虚拟环境就可以在不同的 Python 版本之间切换的解决方案? - Charlie Parker
4
如果您想安装系统上没有安装的Python版本,这个方法可行吗?比如说,您想测试python3.6,但不想触及计算机上已安装的python3.5 - alpha_989
2
@alpha_989,你找到解决方案了吗? - Danil

86
在Windows下,对我来说这个可以工作:
virtualenv --python=c:\Python25\python.exe envname

没有 python.exe 我得到了 WindowsError: [Error 5] 拒绝访问。我安装了 Python2.7.1 和 virtualenv 1.6.1,但我需要 python 2.5.2。


这是唯一对我起作用的方法。感谢您的文章! - Brad123

42

Mac OSX 10.6.8 (Snow Leopard):

1)当您执行pip install virtualenv时,pip命令会与您的某个Python版本相关联,并将virtualenv安装到该版本的Python中。 您可以执行:

 $ which pip   

查看Python版本的方法是运行python --version命令。如果你看到类似于以下内容:

 $ which pip
 /usr/local/bin/pip

那么执行:

$ ls -al /usr/local/bin/pip
lrwxrwxr-x  1 root  admin  65 Apr 10  2015 /usr/local/bin/pip ->
../../../Library/Frameworks/Python.framework/Versions/2.7/bin/pip

输出中可以看到Python的版本。

默认情况下,这将是创建任何新环境时使用的Python版本。但是,您可以使用-p标志指定计算机上安装的任何Python版本在新环境中使用:

$ virtualenv -p python3.2 my_env  
Running virtualenv with interpreter /usr/local/bin/python3.2  
New python executable in my_env/bin/python  
Installing setuptools, pip...done.  

virtualenv my_env 将在当前目录中创建一个文件夹,其中包含Python可执行文件和pip的副本[命令],您可以使用它来安装其他软件包。

http://docs.python-guide.org/en/latest/dev/virtualenvs/

virtualenv只是将计算机上的 Python 复制到新创建的 my_env/bin/ 目录中。

2) 系统 Python 位于 /usr/bin,而我安装的各种 Python 版本默认情况下安装在以下位置:

 /usr/local/bin

3) 我安装的各种Python版本都有像 python2.7 或者 python3.2 这样的名称,我可以使用这些名称而不是完整路径。

========VIRTUALENVWRAPPER=========

1) 我在让 virtualenvwrapper 正常工作上遇到了一些问题。这是我最终放置在 ~/.bash_profile中的内容:

export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/django_projects  #Not very important -- mkproject command uses this
#Added the following based on: 
#http://stackoverflow.com/questions/19665327/virtualenvwrapper-installation-snow-leopard-python
export VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python2.7 
#source /usr/local/bin/virtualenvwrapper.sh
source /Library/Frameworks/Python.framework/Versions/2.7/bin/virtualenvwrapper.sh

2) -p选项在使用virtualenvwrapper时有不同的作用:当我不想使用默认的Python版本时,我必须指定要在新环境中使用的Python解释器的完整路径:

$ mkvirtualenv -p /usr/local/bin/python3.2 my_env
Running virtualenv with interpreter /usr/local/bin/python3
New python executable in my_env/bin/python
Installing setuptools, pip...done.
Usage: source deactivate

removes the 'bin' directory of the environment activated with 'source
activate' from PATH. 

与virtualenv不同,virtualenvwrapper将在由$WORKON_HOME环境变量指定的位置创建环境。这可以将所有的环境保存在一个地方。


在回答中已经有所提到,但是如果你想要创建一个给定Python版本的项目目录和虚拟环境,那么mkproject就是要使用的命令。mkproject -p /usr/bin/python3.6 myNewPython36Project - Jim Factor
@7stud 当我使用cd命令进入/usr/local/bin目录并执行ls -al pip命令时,我得到了以下结果:-rwxr-xr-x 1 root admin 266 23 Mar 09:40 pip - kd12345
@kd12345,“which -a”列出了您的“PATH”环境变量中与“python3”匹配的所有可执行文件,而不仅仅是找到的第一个。如果您执行“ls -al /usr/local/bin/python3”,您可能会看到“/usr/local/bin/python3”是指向“/Library/Frameworks/Python.framework/Versions/3.8/bin/python3”的链接。 - 7stud
@kd12345,可执行文件/usr/bin/python3可能是预装在您的系统上的Python。 - 7stud
@7stud 选择哪一个有关系吗? - kd12345
显示剩余4条评论

37

[2019年11月] 我需要在基于Python 3.8的Arch Linux系统上安装Python 3.7环境(env)。由于系统中没有Python 3.7,因此我无法降级Python以安装所需的软件包。

此外,我想在虚拟环境(venv)中使用该软件包/ Python 3.7。以下是我这样做的方法。


下载Python版本源文件:

我从以下链接下载了Python 3.7.4源文件:

https://www.python.org/downloads/source/

并将其保存到:

/mnt/Vancouver/apps/python_versions/src/Python-3.7.4.tgz

然后我将档案(源文件)解压缩到:

/mnt/Vancouver/apps/python_versions/src/Python-3.7.4/


安装:

[注:在我的系统环境中,不是venv]

cd /mnt/Vancouver/apps/python_versions/src/Python-3.7.4/
time ./configure                 ## 17 sec
time make                        ## 1 min 51 sec
time sudo make install           ## 18 sec
time make clean                  ## 0.3 sec

检查已安装的Python版本:

$ which python
/usr/bin/python

$ python --version
Python 3.8.0

$ which python3.7
/usr/local/bin/python3.7

$ python    ## Python 3.8 [system / env]
Python 3.8.0 (default, Oct 23 2019, 18:51:26) 
[GCC 9.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

$ python3.7    ## newly-installed Python 3.7 package
Python 3.7.4 (default, Nov 20 2019, 11:36:53) 
[GCC 9.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.version)
3.7.4 (default, Nov 20 2019, 11:36:53) 
[GCC 9.2.0]
>>>

$ python3.7 --version                                                                                                 
Python 3.7.4

如何为特定的Python版本创建虚拟环境:

https://docs.python.org/3/tutorial/venv.html

12.2. 创建虚拟环境

用于创建和管理虚拟环境的模块称为venvvenv通常会安装您可用的最新版本的Python。 如果您的系统上有多个Python版本,则可以通过运行python3或任何其他所需版本来选择特定的Python版本。

要创建虚拟环境,请确定要放置它的目录,并将venv模块作为脚本与目录路径一起运行:

python3 -m venv tutorial-env

如果不存在,则将创建tutorial-env目录,并在其中创建包含Python解释器、标准库和各种支持文件的目录。 ...


在Python 3.8操作环境/系统中创建Python 3.7虚拟环境:

python3.7 -m venv ~/venv/py3.7      ## create Python 3.7-based venv
source ~/venv/py3.7/bin/activate    ## activate that venv
deactivate                          ## deactivate that venv (when done, there)

添加到~/.bashrc

alias p37='echo "   [Python 3.7 venv (source ~/venv/py3.7/bin/activate)]" && source ~/venv/py3.7/bin/activate'

测试 Python 3.7 venv:

$ p37                                                                                                                 
[Python 3.7 venv (source ~/venv/py3.7/bin/activate)]

(py3.7)$ python --version
Python 3.7.4

(py3.7)$ python
Python 3.7.4 (default, Nov 20 2019, 11:36:53) 
[GCC 9.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.version)
3.7.4 (default, Nov 20 2019, 11:36:53) 
[GCC 9.2.0] 
>>>

1
这是一个非常详尽的答案! :) 每当我需要将东西从Arch Linux传输到其他任何(例如Debian-ish)系统时,我都会遇到这个问题。 - Robbie Capps
1
@Victoria Stuart,非常感谢。这正是我在寻找的东西。 - daddyodevil
1
以下是如何在Debian上从源代码安装Python 3.7的良好逐步说明 https://linuxize.com/post/how-to-install-python-3-7-on-debian-9/。但通常建议使用`sudo make altinstall,我强烈建议改为以普通用户身份安装,例如,./configure --prefix=/my-python-3.7 && make -j8 && make install。然后您可以执行/my-python-3.7/bin/python -m venv myvirtualenv`。 - oseiskar

30
你应该已经安装了Python版本。如果你已经安装,那么基本上, 使用virtualenv,
virtualenv --python=python3.8 env/place/you/want/to/save/to

使用 venv

python3.8 -m venv env/place/you/want/to/save/to

以上示例适用于Python 3.8,您可以更改它以获得不同版本的虚拟环境,前提是它们已安装在您的计算机上。


如何使用上述命令安装特定版本的Python? - Chandan
如果你的电脑上已经安装了Python3.8,那么上面的示例将创建Python3.8环境。 - CrmXao
是的,它按照你说的方式工作,但我需要一个不同的版本,因为我的电脑安装了Python3.9,但我需要为Python3.6创建虚拟环境。 - Chandan
有没有人尝试过或检查过从特定的conda环境Python版本创建venv会发生什么?根据我所看到和阅读的(这里),这可能会在创建venv时为使用不同的Python版本增加很多灵活性。 - GWD

29
假设您当前在虚拟环境中安装了 Python 2.7,但想要使用 python3.2 版本,您需要执行以下更新操作:
$ virtualenv --python=/usr/bin/python3.2 name_of_your_virtualenv

然后通过以下方式激活你的虚拟环境

$ source activate name_of_your_virtualenv

然后在终端中执行 python --version 命令,检查您的版本是否已更新。


请看下面我提供的使用环境变量的解决方案。这种方法意味着您不必记得使用“-p”。 - Chris Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接