如何管理 Python 依赖项

目录

一、从pip开始

二、用pip安装包

三、用pip删除包

四、升级包 

五、使用需求文件

六、pip的替代方案

七、如何检测项目中的漏洞?


Python 依赖性管理对于项目的良好运行至关重要。如果您的 Python 应用程序依赖于第三方库和框架来运行,那么正确地管理它们可以帮助您获得安全性、可持续性和一致性。

如果您能够很好地管理您的直接依赖关系和传递依赖关系,那么您就可以构建一个高性能和高质量的应用程序。这是将 Python 开发工作提升到下一个层次的必经之路。

本文讨论如何管理 Python 依赖项。我们将演示如何使用流行的 pip 工具来管理 Python 中的依赖关系。如果 pip 不能满足您的使用需求,我们还将推荐一些替代方案。

一、从pip开始

pip (package installer for Python)是用于管理 Python 中包的默认工具。它预装了 Python 版本2.7.9(或更高版本)和 Python 版本3.4(或更高版本)。如果您使用的是较老的 Python 版本,您可以前往pip官网安装 pip。

Installation - pip documentation v22.1.2icon-default.png?t=M5H6https://pip.pypa.io/en/stable/installation/

如果您在其他语言中使用过包管理工具,比如 Node.js 的 npm,那么 pip 在内核上与这些工具是类似的。

您可以在控制台上运行以下命令,以确认计算机上的 pip 可用:

pip -version

例如:

PS C:\Users\User> pip -version
pip 20.2.3 from c:\users\user\appdata\local\programs\python\python39\lib\site-packages\pip (python 3.9)

正如你所看到的,该命令输出 pip 版本以及计算机上安装的 Python 的位置和版本。

二、用pip安装包

Python 通常被认为是一种即拆即用(battery-included)的语言; 也就是说,它有丰富的包和模块集合,您可以使用这些包和模块来简单快速地完成各种各样的任务。

类似地,Python 有一个由贡献者组成的强大社区,它创建了一组更大的包。这些库、工具和框架主要发布在 PyPI (Python Package Index)上。还有其他用于托管 Python 包的公共和私有来源。

您可以使用 pip 轻松地下载和安装依赖项。

例如:

pip install 

上面的命令搜索指定包的最新版本并安装它。它还查找包元数据中可用的依赖项,并安装它们。这样可以确保包具有最佳运行所需的所有条件。

如果出于某种原因想要安装特定的软件包版本,请使用相等运算符(= =)并提示要安装的版本号:

pip install ==

安装完成后,您可以在项目中导入和使用它,例如:

from download import download

path = download(add_url, add_file_path)

三、用pip删除包

在删除包之前,一定要检查它的依赖项列表。如果您删除了其他人正在使用的软件包,您可能会使您的应用程序陷入瘫痪。

首先,可以使用 list 命令列出系统上可用的所有软件包,例如:

 C:\Users\User> pip list
 Package      Version
 ———— ———
 certifi      2020.12.5
 chardet      4.0.0
 click        7.1.2
 download     0.3.5
 Flask        1.1.2
 MarkupSafe   1.1.1
 pip          20.2.3	

接下来,使用 show 命令获取有关已安装包的更多信息,特别是其依赖项列表,例如:

 C:\Users\User> pip show download
 Name: download
 Version: 0.3.5
 Summary: A quick module to help downloading files using python.
 Home-page: https://github.com/choldgraf/download
 Author: None
 Author-email: None
 License: BSD (3-clause)
 Location: c:\users\user\appdata\local\programs\python\python39\lib\site-packages
 Requires: tqdm, requests, six
 Required-by:

正如您在上面所看到的,最后两个字段,Requres 和 Redemand-by,给出了包的依赖项列表。在这种情况下,下载包需要其他三个依赖项,但是任何其他包都不需要它。所以可以移除了。

在理解包的依赖顺序并确定可以安全删除的包之后,可以使用 uninstall 命令卸载它们:

 pip uninstall 

例如:

 C:\Users\User> pip uninstall download
 Found existing installation: download 0.3.5
 Uninstalling download-0.3.5:
   Would remove: 
    c:\users\user\appdata\local\programs\python\python39\lib\site-packages\download-0.3.5.dist-info\*
    c:\users\user\appdata\local\programs\python\python39\lib\site-packages\download\*
 Proceed (y/n)? y
   Successfully uninstalled download-0.3.5

注意,pip 将要求您确认是否要卸载该软件包。如果要取消确认和文件列表,只需添加-y 标志:

 pip uninstall  -y

例如:

 C:\Users\User> pip uninstall download -y
 Found existing installation: download 0.3.2
 Uninstalling download-0.3.2:
   Successfully uninstalled download-0.3.2

如果要卸载多个软件包,可以在一个调用中指定它们的名称:

pip uninstall   

四、升级包 

如果要更新到较新的软件包版本,请使用以下命令:

pip install  –upgrade

以上命令将卸载旧的软件包版本并安装可用的最新版本,例如:

 C:\Users\User> pip install download –upgrade
 Collecting download
   Using cached download-0.3.5-py3-none-any.whl (8.8 kB)
 ….
 Installing collected packages: download
   Attempting uninstall: download
     Found existing installation: download 0.3.2
     Uninstalling download-0.3.2:
       Successfully uninstalled download-0.3.2
 Successfully installed download-0.3.5

五、使用需求文件

需求文件允许您定义运行项目所需的包及其特定版本。按照惯例,该文件名为 requments.txt,但是您可以提供任何您想要的名称。

下面是一个 Requments.txt 文件的示例:

certifi>=2020.11.0
chardet==4.0.0
click>=6.5.0, <7.1
download==0.3.5
Flask>=1.1.0

正如您在上面看到的,您应该在文本文件中的每一行上定义每个包。您还应该使用逻辑运算符来规定包的特定版本。使用需求文件,您可以在另一个系统中复制环境,而不会造成损坏。该文件确保按照需求文件中定义的方式安装指定的包版本。

例如,= = 操作符告诉 pip 只能安装特定的版本,而 > = 规定可以安装精确或更大的版本。对于上面的 click 包,pip 可以安装等于或大于6.5.0但小于7.1的任何版本。

如果您想要安装需求文件中指定的软件包,那么在使用-r 标志来表示需求文件的同时运行 pip install 命令。例如:

pip install -r requirements.txt

需求文件还允许您一次更新多个包。您可以使用带有-update 标志的 install 命令来更新其中列出的所有软件包。例如:

pip install –upgrade -r requirements.txt

您还可以删除需求文件中提供的所有包:

 pip uninstall -r requirements.txt -y

六、pip的替代方案

虽然 pip 是 Python 依赖管理的一个很好的工具,但是还有其他一些工具可以用来有效地管理包。

Pipenv—这是一个更高级的工具,它带有一些附加功能,可以使常见用例的依赖性管理更加顺畅和快速。然而 pip 通常适用于个人项目,Pipenv 通常被推荐用于协作项目。一个值得注意的区别特性是 Pipenv 使用 Pippfile 和 Pippfile.lock,而不是 requments.txt,以确保舒适的确定性构建。

Poetry—此依赖项管理选项允许您声明项目所依赖的库,以便项目可以为您安装、卸载和更新这些库。与 Pipenv 一样,它使 Python 包依赖关系管理更简单、更直观。您可以使用它以确定的方式管理项目,使用一个命令构建和打包项目,并轻松地将其发布到 PyPI。它使用 pyproject.toml 文件编排项目及其依赖项。

七、如何检测项目中的漏洞?

在构建 Python 应用程序时管理依赖关系可以确保跨不同环境进行稳定、可预测的构建。但是如何知道 Python 依赖项中是否存在安全漏洞呢?

泛联新安的CodeAnt开发安全平台支持Python在内的17种语言,支持Win、Linux、银河麒麟等主流环境,完全覆盖CWE7PK、OWASPTOP10、GJB-8114、GJB-5369、MISRA等行业标准与规范。CodeAnt能自动识别软件代码组成成分(如开源组件、商用组件、自研代码)和代码漏洞,支持对基于SpringMVC/SpringBoot、SSM、Struts2、ThinkPHP、Flask等多种常见编程语言框架开发的软件进行源代码静态分析。支持主流IDE插件,提供REST API接口,易于嵌入DevOps流程,为国产软件供应链安全保驾护航。

你可能感兴趣的:(DevSecOps分享,python,源代码管理,安全)