为什么需要 python 虚拟环境
python 的版本和已安装的 package 一直是项目开发需要注意的问题。有些项目需要 python 2,有些必须用 python 3。一个项目中用到的 python package 版本跟其他项目可能还会有冲突。
为了解决这些问题,建议使用 python 虚拟环境。为每个项目创建一个独立的虚拟环境并安装各自需要的 package,项目之间互不干扰。创建虚拟环境可以用 virtualenv 方式,也可以用 conda,这里我们选用 virtualenv 方式。
如何创建 python 虚拟环境
一个好的习惯是将所有的 python 虚拟环境放在同一个文件夹下,便于管理。大体的路径如下:
home/user_name/pyenvs/project1
home/user_name/pyenvs/project2
home/user_name/pyenvs/project3
...
最简单的虚拟环境创建命令:
virtualenv project1
这里 project1 是要创建的虚拟环境的名字,默认是在当前路径下创建虚拟环境。
也可以指定某个具体的路径:
virtualenv ~/path/to/a/virturalEnv
在创建虚拟环境时,如果提示找不到 virtualenv ,很可能系统中还没有安装 virtualenv,可以用下面的命令安装
sudo apt install virtualenv
如果要指定在虚拟环境中用某一版本的 python,可以用如下命令:
virtualenv -p python3 project1
或者更加具体的指定 python 3 的版本,例如指定虚拟环境中用 python 3.6 版本:
virtualenv -p python3.6 project1
不过这里的前提是系统中确实存在 python3.6 版本。关于系统 python 版本的查看和设置可以参考我们之前的文章。
上述命令会在当前目录下创建全新的 python 虚拟环境 project1。原本系统中的 python package 也不能被虚拟环境使用。如果希望新建的虚拟环境可以使用系统的 package,则在创建虚拟环境时添加参数 --system-site-packages
:
virtualenv -p python3.6 --system-site-packages project1
启动 python 某一虚拟环境(例如 project1)命令如下:
source <path to the activate file in project1>
具体地,假设当前目录是在 project1 文件夹中,则用命令
source bin/activate
总之,给出指向虚拟环境文件夹中 activate 文件的路径即可。
在 source 之后,会看到命令行开头多了虚拟环境的名字,这表明当前已处于虚拟环境中,此后安装的所有 python package 都被安装到了此虚拟环境中,与系统的主 python 环境无关,也与其他虚拟环境无关。安装 package 时也不需要 sudo 或者 --user 参数。
如果希望每次打开 terminal 就自动进入某个虚拟环境,可以将上述 source 命令放入 .bashrc 文件中。
要退出虚拟环境,可以在命令行中用如下命令:
deactivate
当不再需要某个虚拟环境时,直接删掉对应的虚拟环境文件夹即可。
如何将虚拟环境设置为 jupyter notebook 的 kernel
jupyter notebook 是一个非常流行的编程环境,很方便调试,也适合发布供其他人参考。可以简单地把 jupyter notebook 看作一个实验报告,里面可以有代码,试验结果图片,文档说明等。目前网上很多教程是用 jupyter notebook 的形式书写的。
在安装了虚拟环境之后,为了在 jupyter 中使用虚拟环境中的 module,我们需要设置与该虚拟环境对应的 jupyter kernel。只需要简单的两步,如下:
- source 进入要设置成 jupyter kernel 的虚拟环境,安装 ipykernel module
pip install ipykernel
- 添加虚拟环境对应的 kernel:
ipython kernel install --user --name=kernel_name_you_like
此后就可以在 jupyter 的 kernel 中选择此虚拟环境对应的 kernel了,虚拟环境中的 module 都可以被调用。
另外两个与 jupyter kernel 相关的常用命令是:
- 查看当前已有的 jupyter kernel:
jupyter kernelspec list
- 删除不再需要的 kernel:
jupyter kernelspec uninstall kernel_name