Pipenv:Python的新包装工具

230 阅读5分钟

每当我们编写某种程序时,我们也会利用外部库和包来避免重新发明轮子。我们还需要确保程序在不同的环境中能够正确执行。因此,我们需要某种配置文件,以一种有组织的方式管理这些要求。

什么是pipenv?

Pipenv是安装Python包和使用虚拟环境的推荐方式。这是因为当我们使用与Python捆绑的pip包管理器时,所有的包都是全局安装的。

我们的Python项目没有封装的环境,比如用**DjangoFlask**或其他一些机器学习项目创建网络应用。

Pipenv允许我们将软件包隔离在特定的环境中。

传统上,程序员创建一个虚拟环境,然后用pip在里面安装软件包。但Pipenv自动创建和管理一个虚拟环境,并允许我们使用Pip 文件 添加和删除软件包,这与各种软件包管理器npm、yarn、composer等类似。

它还会生成永远重要的Pipfile.lock。这被用来产生一个确定性的构建,这意味着对于每个特定的项目,在Pip文件 中列出的相同版本的软件包将被用于该特定项目。

如果项目运行在任何其他地方,如生产环境或云端或不同的机器上,都不会有任何破坏性变化。

pipenv试图解决的一些常见问题

  • 我们不再需要单独使用pip和virtualenv。
  • 要求.txt文件,管理起来很麻烦,在某些情况下还容易出错。pipenv使用的PipfilePipfile.lock 更方便用户使用,易于管理,并减少了错误。
  • Pipenv自动暴露了安全漏洞,除此之外,pipenv还到处使用散列值
  • 它提供了对我们所有软件包的依赖关系图的洞察力。
  • 通过加载.env文件简化了开发工作流程。
  • 它还鼓励使用最新版本的依赖关系,以尽量减少过时的组件产生的安全风险。

另请阅读:Conda vs Pip:选择你的Python软件包管理器

使用pipenv工作

pip install pipenv

使用pip寻找所有的软件包

pip freeze

输出。

certifi==2022.6.15
distlib==0.3.5
filelock==3.7.1        
pep8==1.7.1
pipenv==2022.8.5       
platformdirs==2.5.2    
PySimpleGUI==4.60.3    
virtualenv==20.16.3    
virtualenv-clone==0.5.7

使用pipenv创建并激活一个虚拟环境

pipenv shell

这将创建一个Pipfile,其中包含我们所有的依赖项。让我们来看看我们的Pipfile。

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]

[dev-packages]

[requires]
python_version = "3.10"

  • 检查我们的项目主页信息
pipenv --where  # Output: D:\Python

  • 检查virtualenv信息
pipenv --venv   # Output: C:\Users\Username\.virtualenvs\Python-hSRNNotQ

用pipenv安装一个软件包

pipenv install flask

我们的Pipfile已经更新了软件包,即flask"*''代表flask的最新版本

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
flask = "*"

[dev-packages]

[requires]
python_version = "3.10"

我们还可以看到一个Pipfile.lock 文件,其中包含了所有的依赖关系,也包含了相同的哈希值。下面是锁文件的一瞥。

{
    "_meta": {
        "hash": {
            "sha256": "458ff3b49ddcf0963535dd3aea79b000fa2015d325295d0b04883e31a7adf93e"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.10"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {
        "click": {
            "hashes": [
                "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e",
                "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"
            ],
            "markers": "python_version >= '3.7'",
            "version": "==8.1.3"
        },


  • 安装一个特定版本的软件包
pipenv install Django==2.1.1 

现在我们的Pipfile

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
flask = "*"
django = "==2.1.1"

[dev-packages]

[requires]
python_version = "3.10"

用pipenv卸载一个软件包

pipenv uninstall Django

项目的开发依赖性

在编写程序时,我们需要一些在开发阶段使用的软件包。而在生产中,这些包不再需要,以后会被忽略。nose是Python中的一个测试自动化框架,我们将把它作为开发依赖项来安装。

pipenv install nose --dev

我们的Pipfile现在

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
flask = "*"
django = "==2.1.1"

[dev-packages]
nose = "*"

[requires]
python_version = "3.10"

检查已安装软件包的安全漏洞

它还有一个专门的命令来检查安全漏洞,并在我们的终端显示出来,这样就可以解决这些漏洞。因此,使代码更加健壮。

pipenv check

显示当前安装的依赖关系图信息

这个命令显示了每个包的所有依赖关系,以及所有依赖关系的依赖性。

pipenv graph

输出。

Django==2.1.1
  - pytz [required: Any, installed: 2022.1]
Flask==2.2.2
  - click [required: >=8.0, installed: 8.1.3]
    - colorama [required: Any, installed: 0.4.5]      
  - itsdangerous [required: >=2.0, installed: 2.1.2]  
  - Jinja2 [required: >=3.0, installed: 3.1.2]        
    - MarkupSafe [required: >=2.0, installed: 2.1.1]  
  - Werkzeug [required: >=2.2.2, installed: 2.2.2]    
    - MarkupSafe [required: >=2.1.1, installed: 2.1.1]
nose==1.3.7

在项目部署前设置锁定文件

这确保了 当前项目使用Pipfile.lock中提供的任何依赖关系 ,同时也忽略了Pipfile

# Setup before deployment
pipenv lock

# Ignore Pipfile
pipenv install –-ignore-pipfile

  • 退出当前环境
exit

总结

在这篇文章中,我们经历了建立虚拟环境和使用软件包的常见工作流程,以使用 pipenv 配置一个自定义的 Python 项目。

我们还研究了一些核心命令以及它们修改或提供关于我们设置的信息的方式。我们为不同的项目需要不同的配置。我们有效地管理了我们的包,使它在不同地方使用时不会出现任何错误。Pipenv确保了我们程序的稳定性,并帮助我们为我们的代码提供一个强大的结构。

参考资料

官方文档