在virtualenv中使用不同的python版本

Use different Python version with virtualenv

我有一个Debian系统,当前运行的是python 2.5.4。我正确安装了virtualenv,一切正常。我是否可以将virtualenv与其他版本的python一起使用?

我编译了python 2.6.2并希望将其与一些virtualenv一起使用。是否足以覆盖二进制文件?还是我必须改变一些关于图书馆的事情?


创建virtualenv实例时,只需使用--python选项(或简称-p选项)来指定要使用的python可执行文件,例如:

1
virtualenv --python=/usr/bin/python2.6 <path/to/new/virtualenv/>

注意:对于python 3.3或更高版本,请参考下面的AELFINN答案。


更新:对于python3.6,不推荐使用下面的pyvenv脚本。相反,python文档建议使用以下命令创建虚拟环境:

1
python3 -m venv <myenvname>

对于python3(3.3+),请使用上述方法或脚本pyvenv命令。

1
pyvenv /path/to/new/virtual/environment

请注意,venv不允许使用其他版本的python创建virtualenv。为此,请安装并使用virtualenv软件包。


当您在共享的托管环境中,需要从源代码安装&complie python,然后从您的python版本创建venv时,这些步骤就是。对于python 2.7.9,您可以按照以下几行操作:

1
2
3
4
5
6
7
8
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

虚拟环境

1
2
3
4
5
6
7
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

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


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


有一种更简单的方法,

1
virtualenv venv --python=python2.7

感谢您的评论,只有在系统级安装了python2.7(例如/usr/bin/python2.7)时,这才有效。

否则,如果您使用的是自制,则可以使用路径来提供所需的内容。

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

您可以使用

1
which python

这也适用于python 3。

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

最终冷凝至:

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


在Windows for Me下,此功能工作:

1
virtualenv --python=c:\Python25\python.exe envname

没有python.exe我就得到WindowsError: [Error 5] Access is denied。我用virtualenv 1.6.1安装了python2.7.1,我想要python2.5.2。


Mac OSX 10.6.8(雪豹):

1)当您执行pip install virtualenv时,pip命令与您的一个python版本相关联,并且virtualenv安装到该版本的python中。你可以做到

1
 $ which pip

看看这是什么版本的python。如果你看到类似的东西:

1
2
 $ which pip
 /usr/local/bin/pip

然后这样做:

1
2
3
$ 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版本。但是,您可以指定计算机上安装的任何版本的python,以便在使用-p flag的新环境中使用:

1
2
3
4
$ 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 will create a folder in the current directory which
will contain the Python executable files, and a copy of the pip
[command] which you can use to install other packages.

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

virtualenv只是将python从计算机上的某个位置复制到新创建的my-env/bin/目录中。

2)系统python在/usr/bin中,而我安装的各种python版本默认安装在:

1
 /usr/local/bin

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

==virtualenvwrapper=虚拟环境包装=

1)我在让virtualenvwrapper工作时遇到了一些问题。这就是我最后在~/.bash_profile中提到的:

1
2
3
4
5
6
7
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 option与virtualenvwrapper的工作方式不同:我必须指定在新环境中使用的python解释器的完整路径(当我不想使用默认的python版本时):

1
2
3
4
5
6
7
8
$ 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不同,virtualenwrapper将在$workon_home环境变量指定的位置创建环境。使您的所有环境保持在一个位置。


假设您的virtualenv中当前安装了python 2.7。但要使用python3.2,您必须将此更新为:

1
$ virtualenv --python=/usr/bin/python3.2 name_of_your_virtualenv

然后通过以下方式激活virtualenv:

1
$ source activate name_of_your_virtualenv

然后在shell中执行:python --version,检查您的版本是否已经更新。


这两个命令对新手来说应该很有用

virtualenv -p python2 myenv(用于python2)

virtualenv -p python3 myenv(对于python3)


您可以使用所需的python版本调用virtualenv。例如:

1
python3 -m virtualenv venv

或者直接指向virtualenv路径。例如,对于Windows:

1
c:\Python34\Scripts\virtualenv.exe venv

通过跑步:

1
2
3
4
5
6
venv/bin/python

Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type"help","copyright","credits" or"license" for more information.
>>>

您可以看到在虚拟环境中安装的python版本


-p方法工作得很好,但是你必须记住每次都要使用它。如果您的目标通常是切换到更新版本的Python,那么这是一种痛苦,也可能导致错误。

您的另一个选项是设置一个与-p执行相同操作的环境变量。通过您的~/.bashrc文件或在您为登录会话管理环境变量的任何位置设置:

1
export VIRTUALENV_PYTHON=/path/to/desired/version

那么,在命令行上不指定-p的任何时候,virtualenv都将使用它。


对于Mac(High Sierra),在python3上安装virtualenv,并为python2创建virtualenv:

1
2
3
4
5
 $ python3 -m pip install virtualenv
 $ python3 -m virtualenv --python=python2 vp27
 $ source vp27/bin/activate
 (vp27)$ python --version
 Python 2.7.14


在Mac上,我使用pyenv和virtualenvwrapper。我必须创建一个新的virtualenv。你需要自制啤酒,如果你在Mac电脑上,我假设你已经安装了它,但只是为了好玩:

1
2
3
4
5
6
7
8
ruby -e"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"


brew install pyenv
pyenv install 2.7.10
pyenv global 2.7.10
export PATH=/Users/{USERNAME}/.pyenv/versions/2.7.10/bin:$PATH
mkvirtualenv -p ~/.pyenv/versions/2.7.10/bin/python  {virtual_env_name}

我还先冻结了我的需求,这样我就可以简单地在新的virtualenv中重新安装:

1
pip install -r requirements.txt


更简单的方法是,使用命令替换为您查找python2:

virtualenv -p $(which python2)

或者在使用virtualenvwrapper时:

mkvirtualenv -p $(which python2)


在Windows Linux子系统中:

  • 为python3创建环境:

    1
    virtualenv --python=/usr/bin/python3 env
  • 激活它:

    1
    source env/bin/activate

  • 是的,上面的答案是正确的,并且在基于Unix的系统(如Linux&mac OS X)上运行良好。

    我尝试使用以下命令为python2&python3创建virtualenv。

    在这里,我分别使用venv2和venv3作为python2和python3的名称。

    Python2 »

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    MacBook-Pro-2:~ admin$ virtualenv venv2 --python=`which python2`
    Running virtualenv with interpreter /usr/local/bin/python2
    New python executable in /Users/admin/venv2/bin/python
    Installing setuptools, pip, wheel...done.
    MacBook-Pro-2:~ admin$
    MacBook-Pro-2:~ admin$ ls venv2/bin/
    activate        easy_install        pip2.7          python2.7
    activate.csh        easy_install-2.7    python          wheel
    activate.fish       pip         python-config
    activate_this.py    pip2            python2
    MacBook-Pro-2:~ admin$

    Python3 »

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    MacBook-Pro-2:~ admin$ virtualenv venv3 --python=`which python3`
    Running virtualenv with interpreter /usr/local/bin/python3
    Using base prefix '/Library/Frameworks/Python.framework/Versions/3.6'
    New python executable in /Users/admin/venv3/bin/python3
    Also creating executable in /Users/admin/venv3/bin/python
    Installing setuptools, pip, wheel...done.
    MacBook-Pro-2:~ admin$
    MacBook-Pro-2:~ admin$ ls venv3/bin/
    activate        easy_install        pip3.6          python3.6
    activate.csh        easy_install-3.6    python          wheel
    activate.fish       pip         python-config
    activate_this.py    pip3            python3
    MacBook-Pro-2:~ admin$

    Checking Python installation locations

    1
    2
    3
    4
    5
    6
    MacBook-Pro-2:~ admin$ which python2
    /usr/local/bin/python2
    MacBook-Pro-2:~ admin$
    MacBook-Pro-2:~ admin$ which python3
    /usr/local/bin/python3
    MacBook-Pro-2:~ admin$

    它对我有用

    1
    2
    3
    sudo apt-get install python3-minimal

    virtualenv --no-site-packages --distribute -p /usr/bin/python3 ~/.virtualenvs/py3

    在Windows上:

    1
    py -3.4x32 -m venv venv34

    1
    py -2.6.2 -m venv venv26

    这将使用py启动程序,它将为您找到合适的python可执行文件(假设您已经安装了它)。


    1
    virtualenv -p python3 myenv

    创建virtualenv的链接


    这是virtualenv的一个bug。只要升级你的PIP就可以了。

    pip install --upgrade virtualenv


    对于2019年的Debian(Debian9)系统,我发现了一个简单的解决方案,可以从虚拟环境中解决这个问题。

    假设虚拟环境是通过以下方式创建的:

    1
    python3.7 -m venv myenv

    但是只有python2python2.7的版本,您需要python3.7的最新特性。

    然后,只需运行命令:

    1
    (myvenv) $ python3.7 -m venv --upgrade /home/username/path/to/myvenv/

    将添加python3.7包,如果它们在您的系统上已经可用。