如何在venv中使用与标准库不同的Python版本?(不是virtualenv!)
我安装了Python 3.4.0,并使用python -m venv myenv
创建了一个虚拟环境。请问我该如何在我的虚拟环境中更改Python版本呢?文档上说:
每个虚拟环境都有自己的Python可执行文件(这意味着可以创建不同Python版本的环境),并且可以在其目录中拥有自己独立的一套安装的Python包。
更新
请注意,我问的是标准库中的venv,而不是virtualenv。让我提供一些链接。
- 这是PEP 405。 http://legacy.python.org/dev/peps/pep-0405/
- Python venv。 http://docs.python.org/3.4/library/venv.html
- Virtualenv。 http://www.virtualenv.org/en/latest/
我没有在venv中看到类似--python
的选项。
venv和virtualenv是完全相似的吗?是因为venv不太受欢迎,没人用它,所以virtualenv才保持标准吗?
5 个回答
正如其他回答所说,你需要在系统中已经安装的特定版本才能为它创建虚拟环境。所以如果你在系统的某个地方已经有这个版本,你就可以创建虚拟环境。例如,OSX系统自带Python2.7,因此为了创建一个2.7的虚拟环境,以避免影响系统自带的版本,你可以这样做:
$ virtualenv -p /usr/local/opt/python@2/bin/python2.7 venv
基本上:
$ virtualenv -p <path/to/existing/python> <path/to/new/virtualenv/>
这个问题问得很好,因为有很多Python模块和库(包括内置的和第三方的)名字和功能都很相似。我完全理解提问者的困惑。
其实这里有两个不同的功能:
1). 切换不同版本的Python解释器,比如2.7.10或3.5.0等。
2). 创建虚拟环境(这只是一个本地文件夹,里面包含了特定版本Python所需的所有文件和库。可以把它想象成某个Python版本的“冷冻”本地实例。实际上,它是一个独立、轻量级的Python安装。
像pyvenv
这样的模块提供了2)的功能。它允许你创建一个虚拟环境,这个环境会使用创建它时的Python版本。
$ python --version
Python 3.5.0
$ pyvenv myenv # myenv is now a local environment using Python 3.5.0
关于pyvenv的更多信息,可以查看library/venv
而像pyenv
这样的模块(名字有点让人困惑,对吧?注意,是pyenv,而不是pyvenv)则控制你系统上运行的是哪个版本的Python。这提供了1)的功能。所以,当你没有通过pyvenv等运行特定的虚拟环境时,这就是正在使用的“全局”版本。实际上,这个过程稍微复杂一点(因为你还可以设置本地配置等),但对于这次讨论来说,这样就足够了。
关于pyenv的更多信息,可以查看github.com/yyuu/pyenv
假设我想运行Python版本2.7.10和3.5.0,那么我会使用pyenv来安装这两个版本(在这里,我选择将它们设为全局版本),并可以通过以下命令查看:
$ pyenv versions
system
* 2.7.10 (set by ~/.pyenv/version)
* 3.5.0 (set by ~/.pyenv/version)
$ python --version
Python 3.5.0
$ which python
~/.pyenv/shims/python
$ python2.7 --version
Python 2.7.10
是的,针对上述每个模块/库,还有很多显著的替代品。在Reddit、Stack Overflow等地方有很多热烈的讨论,详细说明和争论哪个更好。它们中的许多功能非常相似……
在Linux或Mac上,你可以很简单地安装多个版本的Python,和主版本并排放在一起。你还可以使用标准库中的venv包来为每个版本(3.3及以上)创建虚拟环境。
创建虚拟环境
$ python3.3 -m venv myvenv_foo # Create a python3.4 venv named 'myvenv_foo'
$ python3.4 -m venv myvenv_bar # Create a python3.4 venv named 'myvenv_bar'
$ python3.5 -m venv myvenv_baz # Create a python3.5 venv named 'myvenv_baz'
# etc...
激活虚拟环境
source myvenv_foo/bin/activate # Activates venv 'myvenv_foo'
停用虚拟环境
deactivate
注意:python
和 pythonX.X
如果你安装了多个Python版本,可以通过在命令中加上版本号来访问每个版本,比如 python3.5
、python3.6
等等。但要记住,当你激活一个虚拟环境时,它会绑定到没有版本号的 python
命令上,只要这个虚拟环境处于激活状态。例如:
$ python -V # Use the *clean* 'python' command to show the main version of the OS.
Python 2.7.6
$ python3.5 -m venv myvenv_foo # Create a new venv from 'python3.5'.
$ source myvenv_foo/bin/activate # Activate venv.
$ python -V # The *clean* 'python' command is now bound to your activated venv.
Python 3.5.2
$ deactivate # Deactivate venv.
$ python -V # Now the *clean* command is bound back to the main version.
Python 2.7.6
注意
我建议使用Pipenv来创建和管理虚拟环境,而不是使用
venv
包。根据官方文档:
直接管理多个虚拟环境可能会变得繁琐,因此依赖管理教程介绍了一种更高级的工具,Pipenv,它会为你正在处理的每个项目和应用自动管理一个独立的虚拟环境。
这根本不可能。要创建一个特定版本的Python虚拟环境,我们需要这个特定的版本。
很明显,一个Python解释器并不会“包含”之前所有版本的功能。比如,Python 3.4.1里面是没有Python 2.7.8的可执行文件的。