如何为python项目创建虚拟环境

我们在开始一个python项目,而不是几行简单的代码时,我们倾向于开始使用第三方的dependencies.当项目越来越大时,我们需要考虑如何有效的管理这些第三方库。当安装第三方库时,我们肯定是想安装在虚拟环境中。帮助我们保持我们实际系统环境的干净,避免打乱整个系统python环境。

我们为什么需要python的虚拟环境?

我们可以使用pip把第三方库安装到python项目中。一个项目中往往要安装多个,鉴于安装的第三方库的各种版本,可能会导致一些兼容和运行的问题。

当我们在python项目中使用pip install <package name> ,我们是安装到全局python下的,将会根据现有的python版本安装第三方包。

我们可以通过以下命令来查找python的安装目录:

python -c "import sys;print('\n'.join(sys.path))"
输出:
C:\Users\Administrator.*\AppData\Local\Programs\Python\Python36\python36.zip
C:\Users\Administrator.*\AppData\Local\Programs\Python\Python36\DLLs
C:\Users\Administrator.*\AppData\Local\Programs\Python\Python36\lib
C:\Users\Administrator.*\AppData\Local\Programs\Python\Python36
C:\Users\Administrator.*\AppData\Local\Programs\Python\Python36\lib\site-packages

如果我们使用pip3 install <package name>,将会安装到python3安装目录的单独的目录下。我们可以用以下命令来覆盖pip3这个命令:

python2.7 -m pip install <package name>

但是这仍然解决不了我们在全局python下安装第三方库的问题,将会出现下列的问题:

  • 不同python项目之间会使用不同版本的第三方库,可能会导致互相冲突
  • 项目的依赖库和操作系统的依赖库会产生冲突,导致出现项目错误或系统错误。
  • 多用户项目将很难实现。
  • 不同版本python和库的代码测试将会是一个挑战

为了避免以上的问题,python开发者使用虚拟环境。这个虚拟环境把安装的这些第三方库在一个隔离的环境中(目录内)保存。

如何创建一个虚拟环境

确保你的系统上已经安装python

python --version

然后看一下pip是否也能正常调用

pip --version

我们需要一个工具来创建python的虚拟环境,venv。它是封装在python3.3+版本以上的python中的。

如果我们使用python2,我们需要手动安装一个工具。这是为数不多的一个我们需要全局安装的第三方库。

python2 -m pip install virtualenv

注意:我们将会在文章中讨论很多venv和python3,操作系统环境不同,可能会导致某些命令的些许不同,某些工具的工作原理也些许不同。

如果你的系统上没有安装pip:

sudo apt-get install python-pip
然后安装virtualenv
pip install virtualenv

我们首先要为项目创建一个文件夹,并进入这个文件夹:

mkdir my-python-project && cd my-python-project

然后我们再创建虚拟环境:

python3 -m venv virtualenv
#创建一个名为virtualenv的虚拟环境给,可以是任何名字

这将会创建一个名为virtualenv的目录,这个目录将会包含bin、lib、include文件夹,还有一个环境配置文件。

所有的文件都是为了确保,所有的代码都运行在当前的虚拟环境下。这会帮我们把工作环境和操作系统环境隔离开来,避免我们之前提到的问题。

为了使用这个虚拟环境,我们需要激活它。激活以后,还会更改我们的命令提示符标志。这个标志也是为了表明虚拟环境已经激活,python的代码都是在这个环境下执行。

#UBUNTU LINUX系统激活虚拟环境
$ source env/bin/activate
(virtualenv) $
#windows激活虚拟环境
E:\my-python-project\virtualenv\Scripts>activate
(virtualenv)E:\my-python-project\virtualenv\Scripts>activate

在虚拟环境下,无法访问使用全局的第三方库,在虚拟环境内安装的库也无法在外部使用。

在虚拟环境中,只有pip和setuptools是默认安装的。

激活虚拟环境后,变量path也会相应地发生改变,以达到虚拟环境的目的。

当我们完成工作,想切换回操作系统的全局环境,我们需要使用deactivate退出虚拟环境。

#linux ubuntu下
(virtualenv) $ deactivate 
$

#windows系统下
(virtualenv) E:\my-python-project\virtualenv\Scripts>deactivate
E:\my-python-project\virtualenv\Scripts>

如何管理虚拟环境下的第三方库

我们配置了虚拟环境并激活以后,我们不想在分享项目时,连同使用pip install命令安装的第三方库也一起分享。我们想去除我们的虚拟环境文件夹,但仍然可以在其他的电脑或系统上重新运行我们的工作。

为实现这个目的,我们可以在项目根目录下创建一个requirement文件。假设我们在虚拟环境下安装flask,安装完成后我们使用pip freeze命令。它将会列出我们已经安装过的库名和版本号。

(virtualenv) $ pip freeze
click==8.0.3
colorama==0.4.4
dataclasses==0.8
Flask==2.0.2
importlib-metadata==4.8.1
itsdangerous==2.0.1
Jinja2==3.0.2
MarkupSafe==2.0.1
typing-extensions==3.10.0.2
Werkzeug==2.0.2
zipp==3.6.0

我们可以将这个列表写到requirement文件中,上传到git保存,或以任何形式跟他人分享。

(virtualenv) $ pip freeze > requirements.txt

这个命令也可以更新这个requirements.txt文件,所以在每次安装一个新的第三方库时,我们都习惯性的运行一下这个命令,来更新我们的安装列表。

然后,如果任何人想在他们的电脑上运行我们的项目,他们只需要做:

$ cd copied-project/
$ python3 -m venv virtualenv/
$ python3 -m pip install -r requirements.txt

所有的一切都如在我们电脑上运行的一样。

使用pipenv来创建python虚拟环境

安装pipenv

pip install pipenv

pipenv基本上是pip的一个替代工具。它引入了两个文件,pipfile用来替换requirements.txt,Pipfile lock(which enables deterministic builds,确定第三方库的子依赖库版本的更新的解决方案)

pipenv在机理上是运行pip和virtualenv,但使用一个命令来简化操作。

$ cd project_folder
pipenv shell
#如果当前目录没有虚拟环境给,会自动创建一个新的虚拟环境。
#你可以指定使用python3或python2的版本 --two或--three
#前提是操作系统上也要安装相应版本的python
pipenv shell --two 或 --three

安装第三方库,如flask,或numpy

pipenv install flask==0.12.1
pipenv install numpy #也可以不指定版本号

也可以从Version Control system比如git来安装第三方库

pipenv install -e git+https://github.com/requests/requests.git#egg=requests

需要注意上面的-e参数可以使安装editable,目前对于pipenv来说是必须的。

如果你需要使用pytest来测试项目,但在上线后不需要这个库,你可以指定这个库仅仅作用于开发模式 –dev.

pipenv install pytest --dev

–dev将会把第三库放到pipfile的一个单独的地方【dev-packages】。

如果你现在完成了开发,本地运行正常,你想锁定你的开发环境,并转至线上。使用如下命令确保开发环境:

pipenv lock

这个代码将会创建或更新你的环境,你无需手动更改编辑。我们也应该一直使用自动生成的文件。

lock以后,在production环境,你需要安装最新的成功的运行环境。

pipenv install --ignore-pipfile

这个命令是告诉pipenv,安装时忽略pipfile,用pipfile.lock里的列表。pipenv将会创建一模一样的环境,包括子依赖库。

现在,另一个人想要对代码做些更改,这种情况下,他得到代码,包括pipfile,运行如下命令

pipenv install --dev

这个命令将会安装开发所需的所有的第三方库,包括普通的install以及–dev安装的。

如果没有指定版本号,install命令就会给第三方包括子依赖库一个机会去升级它们的版本

举例,现在你开发用到的一个第三库有了版本升级,因为你不需要一个特定的版本,所以你在install的时候没有指定版本号。当你运行pipenv install时,最新版本的第三方库会安装到你的开发环境内。

然后你对代码做了一些更改,结果如预期一样。然后你再重复上面的步骤lock你的环境。并更新至Production.

pipenv常用的一些命令

#打开一个第三方库 
pipenv open flask

将会使用默认的editor打开第三方库的代码。

无需shell运行某个命令
pipenv run <command>
检查环境安全性
pipenv check
删除某个库
pipenv uninstall numpy
删除所有库
pipenv uninstall --all
删除所有开发时用到的库
pipenv uninstall --all-dev

内容出处:,

声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时修改或删除。文章链接:http://www.yixao.com/tech/29738.html

发表评论

登录后才能评论