python 软件包_以正确的方式管理Python软件包

python 软件包

Python包索引(PyPI)索引了一系列令人惊奇的库和应用程序,涵盖了所有可以想象的用例。 但是,在安装和使用这些软件包时,新手经常会发现自己遇到了以下问题:缺少权限,不兼容的库依赖项以及以令人惊讶的方式中断的安装。

在系统范围内安装应用程序

pip是Python世界中事实上的软件包管理器。 它可以从许多来源安装软件包,但是PyPI是使用它的主要软件包来源。 在安装软件包时, pip首先会解决依赖关系,检查它们是否已经安装在系统上,如果没有,则安装它们。 满足所有依赖关系后,它将继续安装请求的软件包。 默认情况下,所有这些都是全局发生的,将所有内容都安装在与操作系统相关的单个位置中。

Python 3.7在以下位置的Arch Linux系统上寻找软件包:

Where Python 3.7 looks for packages on an Arch Linux system

全局安装的一个问题是,对于给定的Python解释器,一次只能安装一个软件包的单个版本。 当程序包是多个库或应用程序的依赖项,但它们需要此依赖项的不同版本时,这可能会导致问题。 即使一切正常,升级依赖关系(即使在安装其他软件包时偶然)也有可能在将来破坏这些应用程序或库。

另一个潜在的问题是,大多数类似Unix的发行版都使用内置的软件包管理器( yumaptpacmanbrew等)来管理Python软件包,并且其中一些工具安装在用户不可写的位置。

installing packages into a non-user-writeable location

失败是因为我们以非root用户身份运行pip install ,并且我们没有对site-packages目录的写许可权。

如果我们以root用户身份尝试该怎么办?

Running pip install as root

有效!

但是,一个问题是,我们只是将一堆Python软件包安装到Linux发行版的软件包管理器所拥有的位置,这使得其内部数据库与安装不一致。 每当我们尝试使用程序包管理器安装,升级或删除任何这些依赖项时,这都可能会引起问题。

例如,让我们尝试再次安装pytest ,但是现在使用pacman

Installing pytest using pacman

就像py一样,它也可能是pytest的依赖项之一。 安装将以相同的方式失败。

另一个潜在的问题是,操作系统(OS)可以将Python用于系统工具,我们可以通过在系统软件包管理器之外修改Python软件包来轻松地将其破坏。 这可能导致系统无法运行,而从备份中还原或完全重新安装是修复该系统的唯一方法。

sudo pip install:一个坏主意

还有一个原因为什么以root用户身份运行pip install是一个坏主意。 为了解释这一点,我们首先必须看看如何打包Python库和应用程序。

当今,大多数Python库和应用程序都使用setuptools作为其构建系统。 setuptools在项目的根目录中需要一个setup.py文件,该文件描述了包元数据,并且可以包含任意Python代码以自定义构建过程。 从源代码发行版安装软件包时,将执行此文件以执行安装并执行诸如检查系统,构建软件包等任务。

拥有root权限执行setup.py意味着我们可以有效地向恶意代码或错误开放系统。 这比您想象的要大得多。 例如,在2017年,几个软件包被上传到PyPI ,其名称类似于流行的Python库。 上载的代码收集了系统和用户信息,并将其上载到远程服务器。 此后不久将这些包装袋拉出。 但是,由于任何人都可以将软件包上载到PyPI,并且没有任何复查程序来确保代码不会造成任何危害,因此任何时候都可能发生此类“类型抢注”事件。

Python软件基金会(PSF)最近宣布,得益于Facebook的一笔金钱礼物,它将赞助提高PyPI安全性的工作。 这将使执行“ pytosquatting ”之类的攻击变得更加困难,并希望在将来减少此类问题。

除了安全性问题外, sudo pip install不能解决所有的依赖问题:您仍然只能安装任何给定库的单个版本,这意味着以这种方式破坏应用程序仍然很容易。

让我们看一些更好的选择。

操作系统软件包管理器

我们在选择的操作系统上使用的“本机”软件包管理器很可能也可以安装Python软件包。 问题是:我们应该使用pip还是aptyumpacman等?

答案是: 取决于

pip通常用于直接从PyPI安装软件包,Python软件包作者通常将其软件包上传到那里。 但是,大多数软件包维护者不会使用PyPI,而是从作者或版本控制系统(例如GitHub)创建的源代码发布( sdist )中获取源代码,在需要时应用补丁程序,然后针对以下情况测试并发布该软件包:他们各自的平台。 与PyPI分发模型相比,这具有优点和缺点:

  • 由本机软件包管理器维护的软件通常更稳定,并且在给定平台上通常可以更好地运行(尽管并非总是如此)。
  • 这也意味着打包和测试上游Python代码需要花费更多的工作:
    1. 软件包的选择通常比PyPI提供的要小得多。
    2. 更新速度较慢,并且程序包管理器通常会发布更旧的版本。

如果我们要使用的软件包可用并且我们不介意稍旧的版本,则软件包管理器提供了一种方便且安全的方式来安装Python软件包。 而且,由于这些软件包在系统范围内安装,因此系统上的所有用户都可以使用它们。 这也意味着,只有在我们具有在系统上安装软件包所需的权限时,我们才能使用它们。

如果我们要使用软件包管理器选择中未提供的或太旧的东西,或者我们根本没有安装软件包的必要权限,则可以使用pip代替。

用户方案安装

pip支持Python 2.6中引入的“用户方案”模式。 这允许将软件包安装到用户拥有的位置。 在Linux上,这通常是〜/ .local 。 将〜/ .local / bin /放在我们的PATH上将使我们可以轻松使用Python工具和脚本,并在没有root特权的情况下进行管理。

User scheme

但是,如果以及当我们需要同一软件包的不同版本时,此解决方案无法解决问题。

进入虚拟环境

虚拟环境提供了隔离的Python软件包安装,可以独立共存于同一系统上。 这提供了与用户方案安装相同的好处,但是它还允许在应用程序不与任何其他应用程序共享依赖项的情况下创建独立的Python安装。 Virtualenv创建一个目录,其中包含一个自包含的Python安装,包括Python二进制文件和软件包管理的基本工具: setuptoolspipwheel

创建虚拟环境

virtualenv是第三方软件包,但是Python 3.3将venv软件包添加到了标准库中。 因此,我们无需安装任何程序即可在现代版本的Python中使用虚拟环境。 我们可以简单地使用python3.7 -m venv <env_name>创建一个新的虚拟环境。

创建新的虚拟环境后,我们必须通过在新创建的环境的bin目录中获取激活脚本来激活它。 激活脚本将创建一个新的子外壳,并将bin目录添加到PATH环境变量中,使我们能够从此位置运行二进制文件和脚本。 这意味着该子shell将使用pythonpip或此位置中安装的任何其他工具,而不是系统上全局安装的工具。

Creating and activating a new environment under test-env

test-env下创建和激活新环境。

之后,我们执行的所有命令都将在虚拟环境中使用Python安装。 让我们安装一些软件包。

Installing packages in a virtual environment

我们可以在虚拟环境中使用黑色 ,而无需对PATHPYTHONPATH等环境变量进行任何手动更改。

Using black inside the virtual environment

完成虚拟环境后,我们可以简单地使用deactivate函数将其停用

Deactivating the virtual environment

虚拟环境也可以在没有激活脚本的情况下使用。 安装在venv中的脚本将重新编写其shebang行,以在虚拟环境中使用Python解释器。 这样,我们可以使用脚本的完整路径从系统上的任何位置执行脚本。

Executing a script in a virtual environment

我们可以简单地在系统上的任何地方运行〜/ test-env / bin / black ,它将正常工作。

将某些常用的虚拟环境添加到PATH环境变量中可能很有用,因此我们可以快速轻松地在其中使用脚本,而无需输入完整路径:

 export PATH=$PATH:~/test-env/bin 

现在,当我们执行black时 ,它将从虚拟环境中拾取(除非它出现在PATH的其他位置 )。 将此行添加到您的Shell的初始化文件(例如〜/ .bashrc )中,以在所有新的Shell中自动设置它。

虚拟环境通常用于Python开发,因为每个项目都有自己的环境,可以在其中安装所有库依赖项而不会干扰系统安装。

我建议您检出virtualenvwrapper项目,该项目可以帮助简化常见的基于virtualenv的工作流程。

那Conda呢?

Conda是一个软件包管理工具,可以将Anaconda提供的软件包安装在repo.continuum.io存储库中。 它已经变得非常流行,尤其是对于数据科学而言。 它提供了一种创建和管理环境以及在其中安装软件包的简便方法。 与pip相比,缺点之一是包装选择小得多。

成功包装管理的秘诀

  • 永远不要运行sudo pip install
  • 如果要使软件包可供计算机的所有用户使用,则您具有正确的权限并且该软件包可用,然后使用发行版的软件包管理器( aptyumpacmanbrew等)。
  • 如果您没有root权限或OS软件包管理器没有所需的软件包,请使用pip install --user并将用户安装目录添加到PATH环境变量中。
  • 如果您希望同一个库的多个版本共存,进行Python开发或出于任何其他原因仅用于隔离依赖关系,请使用虚拟环境。

翻译自: https://opensource.com/article/19/4/managing-python-packages

python 软件包

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值