pipenv使用

介绍

Pipenv是基于pip的Python包管理工具,它和pip的用法非常相似,可以看作pip的加强版,它的出现解决了旧的pip+virtualenv+requirements.txt的工作方式的弊端。具体来说,它是pip、Pipfile和Virtualenv的结合体,它让包安装、包依赖管理和虚拟环境管理更加方便,使用它可以实现高效的Python项目开发工作流。

创建虚拟环境

在Python中,虚拟环境(virtual enviroment)就是隔离的Python解释器环境。通过创建虚拟环境,可以拥有一个独立的Python解释器环境。这样做的好处是可以为每一个项目创建独立的Python解释器环境,因为不同的项目常常会依赖不同版本的库或Python版本。


使用虚拟环境可以保持全局Python解释器环境的干净,避免包和版本的混乱,并且可以方便地区分和记录每个项目的依赖,以便在新环境下复现依赖环境。

虚拟环境通常使用Virtualenv来创建,但是为了更方便地管理虚拟环境和依赖包,我们将会使用集成了Virtualenv的Pipenv。首先确保我们当前工作目录在示例程序项目的根目录,即pipenv文件夹中,然后使用pipenv install命令为当前的项目创建虚拟环境:

[root@chine pipenv]# pipenv install
Creating a virtualenv for this project...
Pipfile: /root/pipenv/Pipfile
Using /usr/bin/python3.6m (3.6.8) to create virtualenv...
⠇ Creating virtual environment...created virtual environment CPython3.6.8.final.0-64 in 2151ms
  creator CPython3Posix(dest=/root/.local/share/virtualenvs/pipenv-EMLcMOpm, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/root/.local/share/virtualenv)
    added seed packages: pip==21.3.1, setuptools==59.6.0, wheel==0.37.1
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

✔ Successfully created virtual environment!
Virtualenv location: /root/.local/share/virtualenvs/pipenv-EMLcMOpm
requirements.txt found in /root instead of Pipfile! Converting...
⠋ Importing requirements.../usr/lib64/python3.6/_collections_abc.py:833: ResourceWarning: unclosed <ssl.SSLSocket fd=3, family=AddressFamily.AF_INET, type=2049, proto=6, laddr=('172.21.119.162', 50574), raddr=('151.101.192.223', 443)>
  self, *args = args
✔ Success!
Warning: Your Pipfile now contains pinned versions, if your requirements.txt did.
We recommend updating your Pipfile to specify the "*" version, instead.
Pipfile.lock not found, creating...
Locking [dev-packages] dependencies...
Locking [packages] dependencies...
Building requirements...
Resolving dependencies...
✔ Success!
Updated Pipfile.lock (154e43)!
Installing dependencies from Pipfile.lock (154e43)...
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 10/10 — 00:00:06
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.

自动生成PipfilePipfile.lock 文件

[root@chine pipenv]# cat Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
click = "==8.0.4"
dataclasses = "==0.8"
flask = "==2.0.3"
importlib-metadata = "==4.8.3"
itsdangerous = "==2.0.1"
jinja2 = "==3.0.3"
markupsafe = "==2.0.1"
typing-extensions = "==4.1.1"
werkzeug = "==2.0.3"
zipp = "==3.6.0"

[dev-packages]

[requires]
python_version = "3.6"

这会为当前项目创建一个文件夹,其中包含隔离的Python解释器环境,并且安装pip、wheel、setuptools等基本的包。因为示例程序仓库里包含Pipfile文件,所以这个文件中列出的依赖包也会一并被安装,下面会具体介绍。

默认情况下,Pipenv会统一管理所有虚拟环境。Linux或macOS会在~/.local/share/virtualenvs/目录下创建。如果你想在项目目录内创建虚拟环境文件夹,可以设置环境变量PIPENV_VENV_IN_PROJECT,这时名为.venv的虚拟环境文件夹将在项目根目录被创建。虚拟环境文件夹的目录名称的形式为“当前项目目录名+一串随机字符”,比如上面的pipenv-EMLcMOpm。

可以通过--three和--two选项来声明虚拟环境中使用的Python版本(分别对应Python3和Python2),或是使用--python选项指定具体的版本号。同时要确保对应版本的Python已经安装在电脑中。在单独使用Virtualenv时,我们通常会显式地激活虚拟环境。在Pipenv中,可以使用pipenv shell命令显式地激活虚拟环境:

[root@chine pipenv]# pipenv shell
Launching subshell in virtual environment...
 . /root/.local/share/virtualenvs/pipenv-EMLcMOpm/bin/activate
[root@chine pipenv]#  . /root/.local/share/virtualenvs/pipenv-EMLcMOpm/bin/activate
(pipenv) [root@chine pipenv]#

提示当执行pipenv shellpipenv run命令时,Pipenv会自动从项目目录下的.env文件中加载环境变量。Pipenv会启动一个激活虚拟环境的子shell,现在你会发现命令行提示符前添加了虚拟环境名“(虚拟环境名称)”,比如:(pipenv) 。这说明我们已经成功激活了虚拟环境,现在所有命令都会在虚拟环境中执行。需要退出虚拟环境时,使用exit命令。

除了显式地激活虚拟环境,Pipenv还提供了一个pipenv run XXX命令,这个命令允许你不显式激活虚拟环境即可在当前项目的虚拟环境中执行命令,比如:pipenv run python hello.py这会使用虚拟环境中的Python解释器,而不是全局的Python解释器。事实上,和显式激活/关闭虚拟环境的传统方式相比,pipenv run XXX是更推荐的做法,因为这个命令可以让我们在执行操作时不用关心自己是否激活了虚拟环境。当然,我们可以自由选择自己偏爱的用法。

管理依赖

一个程序通常会使用很多的Python包,即依赖(dependency)。而程序不仅仅会在一台电脑上运行,程序部署上线时需要安装到远程服务器上,而你也许会把它分享给朋友。如果你打算开源的话,就可能会有更多的人需要在他们的电脑上运行。为了能顺利运行程序,他们不得不记下所有依赖包,然后使用pip或Pipenv安装,这些重复无用的工作当然应该避免。

在以前我们通常使用pip搭配一个requirements.txt文件来记录依赖。但requirements.txt需要手动维护,在使用上不够灵活。Pipfile的出现就是为了替代难于管理的requirements.txt。

在创建虚拟环境时,如果项目根目录下没有Pipfile文件,pipenv install命令还会在项目文件夹根目录下创建Pipfile和Pipfile.lock文件,前者用来记录项目依赖包列表,而后者记录了固定版本的详细依赖包列表。当我们使用Pipenv安装/删除/更新依赖包时,Pipfile以及Pipfile.lock会自动更新。

[root@chine pipenv]# pipenv install requests
Installing requests...
Adding requests to Pipfile's [packages]...
✔ Installation Succeeded
Pipfile.lock (154e43) out of date, updating to (c8972a)...
Locking [dev-packages] dependencies...
Locking [packages] dependencies...
Building requirements...
Resolving dependencies...
✔ Success!
Updated Pipfile.lock (c8972a)!
Installing dependencies from Pipfile.lock (c8972a)...
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
[root@chine pipenv]# cat Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
click = "==8.0.4"
dataclasses = "==0.8"
flask = "==2.0.3"
importlib-metadata = "==4.8.3"
itsdangerous = "==2.0.1"
jinja2 = "==3.0.3"
markupsafe = "==2.0.1"
typing-extensions = "==4.1.1"
werkzeug = "==2.0.3"
zipp = "==3.6.0"
requests = "*"

[dev-packages]

[requires]
python_version = "3.6"

可以使用pipenv graph命令查看当前环境下的依赖情况,或是在虚拟环境中使用pip list命令查看依赖列表。

[root@chine pipenv]# pipenv graph
Flask==2.0.3
  - click [required: >=7.1.2, installed: 8.0.4]
    - importlib-metadata [required: Any, installed: 4.8.3]
      - typing-extensions [required: >=3.6.4, installed: 4.1.1]
      - zipp [required: >=0.5, installed: 3.6.0]
  - itsdangerous [required: >=2.0, installed: 2.0.1]
  - Jinja2 [required: >=3.0, installed: 3.0.3]
    - MarkupSafe [required: >=2.0, installed: 2.0.1]
  - Werkzeug [required: >=2.0, installed: 2.0.3]
    - dataclasses [required: Any, installed: 0.8]
requests==2.27.1
  - certifi [required: >=2017.4.17, installed: 2024.2.2]
  - charset-normalizer [required: ~=2.0.0, installed: 2.0.12]
  - idna [required: >=2.5,<4, installed: 3.6]
  - urllib3 [required: >=1.21.1,<1.27, installed: 1.26.18]

当需要在一个新的环境运行程序时,只需要执行pipenv install命令。Pipenv就会创建一个新的虚拟环境,然后自动从Pipfile中读取依赖并安装到新创建的虚拟环境中。

其他命令

卸载第三方库pipenv uninstall xxx,自动更新Pipfile

开发环境安装pipenv install requests --dev

查看虚拟环境安装路径pipenv --venv

[root@chine pipenv]# pipenv --venv
/root/.local/share/virtualenvs/pipenv-EMLcMOpm

移除虚拟环境pipenv --rm,会

[root@chine pipenv]# pipenv --rm
Removing virtualenv (/root/.local/share/virtualenvs/pipenv-EMLcMOpm)...
posted @ 2024-02-28 12:57  中华强  阅读(56)  评论(0)    收藏  举报