python 软件包

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

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

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

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

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

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

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

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

有效!

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

例如,让我们尝试再次安装pytest ,但是现在使用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特权的情况下进行管理。

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

进入虚拟环境

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

创建虚拟环境

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

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

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

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

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

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

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

我们可以简单地在系统上的任何地方运行〜/ 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 软件包

python 软件包_以正确的方式管理Python软件包相关推荐

  1. Python Matplotlib绘图的正确打开方式

    Python Matplotlib绘图的正确打开方式 文章目录 Python Matplotlib绘图的正确打开方式 1.先搞懂fig.axes.axis `Figure` `Axes` `Axis` ...

  2. 学python最好的方式是什么意思_通过5个步骤以正确的方式学习Python

    1.弄清楚你的动机是什么 在开始深入学习Python在线之前,值得问问自己为什么要学习它.这是因为这将是一个漫长而有时痛苦的旅程.没有足够的动力,你可能无法完成. 找出激励你的动力将帮助你找到一个最终 ...

  3. 怎么用python表白_如何正确使用Python进行表白?这是个值得思考的问题!

    提到程序员, 可能每个同学都认识一个-- 爱穿格子衬衫.冲锋衣,爱宅着敲代码的程序员或者准程序员, 他们仿佛永远在bug和debug的路上, 还总爱自黑自己是"单身狗", 如何正确 ...

  4. 怎么用python表白_如何正确使用Python进行表白

    原标题:如何正确使用Python进行表白 提到程序员, 可能每个同学都认识一个-- 爱穿格子衬衫.冲锋衣,爱宅着敲代码的程序员或者准程序员, 他们仿佛永远在bug和debug的路上, 还总爱自黑自己是 ...

  5. python 360个顶级软件包_我们在360如何使用Python - 引言

    打算写这样一个系列,说说我们在360里面,如何使用Python.在360,除非是需要包含在360客户端软件当中的功能,技术人员使用什么语言进行开发,更多的是一种个人,最多是项目团队的决定.因此我们的同 ...

  6. 请给出计算231-1的python表达式_计算 2 31 -1 的 Python 表达式是 。_学小易找答案

    [填空题]国内教学目标分类的二维层次模型中,教学内容被分为哪五个层次:事实.概念.技能.______.问题解决. [多选题]报表子系统提供的图表格式一般包括? [填空题]激发和维持学生学习动机的模型- ...

  7. 下列有关python语言的说法正确的是-关于 Python 语言的注释,以下选项中描述正确的是( )...

    [多选题]以下选项属于 Python 整数类型的是( ) [其它]根据CAD原文件绘制别墅立面图:如图 别墅立面图002.dwg [单选题]字符串是一个连续的字符序列,用________方式打印出可以 ...

  8. ai python 面试_面试分享系列 | 17道Python面试题,让你在求职中无往不利

    今天给大家分享的是Python面试题系列的第一篇文章,后续我也会陆续整理Python相关的问题给大家,无论是求职者还是新人都可以通过面试题来考察自己的能力缺陷. 1.Python中pass语句的作用是 ...

  9. 下载anaconda前需要卸载python吗_装了anaconda要卸载python吗

    装了anaconda其实是可以选择卸载python,当然也可以不卸载.Anaconda 是Python的一个发行版,里面内置了很多工具,不用单独安装,因为做了优化也免去了单独安装带来的一些麻烦. An ...

最新文章

  1. ServiceProcessInstaller 类
  2. hibernate中的 bag
  3. php 通知客户端,PHP+SSE服务器向客户端推送消息
  4. ELI5 和scikit-learn文本分类管道
  5. unity热更新json_Unity热更新之AssetBundle打包篇
  6. nginx的root和alias指令的区别
  7. python的一些库(模块)集合
  8. STM8学习笔记---利用PWM功能输出SPWM波
  9. Git详解之六 Git工具(转)
  10. 「数据新星」Databricks 崛起启示录
  11. libGDX游戏开发之NPC敌人事件(六)
  12. 常见路由器配置NAT/UPNP/DMZ方法
  13. 学习go语言里Duck typing 概念
  14. 用iText把图片转成PDF
  15. 征服,才是技术人的本能
  16. 第十七天(续第十六天BPDU相关知识以及STP的配置)
  17. python_pandas入门(by offical document/reference)/loc和iloc操作/dataframe插入操作/pandas读取无表头的文件/查找某一列是否有某个值
  18. 如何使用RSA 对数据加解密和签名验签?一篇文章带你搞定
  19. 关于Python的面向对象
  20. NLU(Natural Language Understanding)太难了

热门文章

  1. 基于Qemu虚拟vexpress-a9开发板,实现完整系统启动(uboot+kernel+rootfs)
  2. 【minimal problem】资料整理
  3. 004--自找麻烦之 vue2.0
  4. POI java导出Excel设置自适应行高
  5. C#从字节数组截取片段(转载)
  6. 法国留学DIY的必备条件和步骤
  7. 从零开始的MySQL教程——下
  8. python爬取阿里巴巴网站实现
  9. python 二维列表获取其中元素_Python中二维列表如何获取子区域元素的组成
  10. 2021年上海第一批高新技术企业上海熙有网络科技集团榜上有名