virtualenv 可以创建一个独立的 Python 执行环境。
安装:
$ pip3 install virtualenv
安装好后,就可以在终端中使用 virtualenv 命令了。
查看安装的版本:
$ virtualenv --version
16.4.0
入门示例
创建新的执行环境:
$ mkdir py-project
$ cd py-project
$ virtualenv ENV
Using base prefix '/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6'
New python executable in /Users/letian/Desktop/py-project/ENV/bin/python3.6
Also creating executable in /Users/letian/Desktop/py-project/ENV/bin/python
Installing setuptools, pip, wheel...
done.
$ ls
ENV
virtualenv ENV
命令会在当前目录创建ENV
目录,在该目录中创建一个新的 Python 执行环境。
切换到ENV
环境:
$ source ./ENV/bin/activate
(ENV) $
此时终端中的提示符号从$
变成了(ENV) $
。
在新的执行环境中看下 Python 、pip 的位置和版本:
(ENV) $ which python
/Users/letian/Desktop/py-project/ENV/bin/python
(ENV) $ which pip
/Users/letian/Desktop/py-project/ENV/bin/pip
(ENV) $ python --version
Python 3.6.4
退出ENV
环境:
两种方式:
- 方式1:退出当前终端会话
- 方式2:使用
deactivate
:
(ENV) $ deactivate
$
第三方库的管理
上面的示例中我们创建了一个ENV
的独立执行环境,它的第三方库和操作系统中的是隔离的。 比如,默认的 Python 环境安装了一个 requests 库,那么这个ENV
环境里是没有这个库的。如果有需要,那么就单独安装:
(ENV) $ pip install requests
在./ENV/lib/python3.6/site-packages
下可以找到安装的 requests 库。
我使用的macOS,我们看下sys.path
的内容:
(ENV) $ python -c "import sys;print(sys.path)"
['', '/Users/letian/Desktop/py-project/ENV/lib/python36.zip', '/Users/letian/Desktop/py-project/ENV/lib/python3.6', '/Users/letian/Desktop/py-project/ENV/lib/python3.6/lib-dynload', '/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6', '/Users/letian/Desktop/py-project/ENV/lib/python3.6/site-packages']
如果想访问系统的第三方库,该怎么办?在创建运行环境的时候加上--system-site-packages
参数就行。
我们现在操作系统 Python 环境安装 requests 库:
$ pip3 install requests
生成新的执行环境:
$ virtualenv --system-site-packages ENV2
我们看下能不能引用系统的第三方库:
$ source ./ENV2/bin/activate
(ENV2) $ python -c "import sys;print(sys.path)"
['', '/Users/letian/Desktop/py-project/ENV2/lib/python36.zip', '/Users/letian/Desktop/py-project/ENV2/lib/python3.6', '/Users/letian/Desktop/py-project/ENV2/lib/python3.6/lib-dynload', '/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6', '/Users/letian/Desktop/py-project/ENV2/lib/python3.6/site-packages', '/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages']
(ENV2) $ python
Python 3.6.4 (default, Jan 6 2018, 11:51:15)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
sys.path
比之前多了一个'/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages'
,这个是操作系统级的Python第三方库存放位置。
注意,若使用 pip install requests --user 安装requests库,库的安装位置不是系统级的,而是在用户级别。此时使用
--system-site-packages
创建的独立Python环境,运行import requests
会失败。
指定 Python 版本
virtualenv
是使用 pip3 安装的,所以默认创建的环境是 Python 3 的。如果现在系统中还安装了 Python 2,那么如何创建一个独立的 Python 2 执行环境呢? 答案是,创建环境时使用 -p
参数指定 python 执行文件。
$ virtualenv -p /usr/bin/python2.7 ENV27