【问题标题】:How to update Python Standard Library packages with pip?如何使用 pip 更新 Python 标准库包?
【发布时间】:2018-04-02 18:31:30
【问题描述】:

我正在为我的 Python 项目创建一个 requirements.txt 文件。当有人通过pip 安装我的项目时;我希望pip 也能下载Tkintertime Python 模块,它们都是Python 标准库中的模块。

我使用命令 pip freeze 列出了所有当前安装的 Python 包,但是当我向下滚动到 T 部分时,我在列表。然后我尝试使用命令pip install Tkinter 通过pip 安装Tkinter,但出现以下错误:

Could not find a version that satisfies the requirement Tkinter (from versions: )
No matching distribution found for Tkinter

我也对time 做了同样的事情,得到了同样的错误。 (我正在运行 Python 3.6 和 Windows 10。)

是否有可能在pip 安装我的包时让pip 安装这些模块,还是我只需要相信因为用户安装了Python,他们也会安装Tkintertime ?

欢迎并感谢所有帮助!

【问题讨论】:

    标签: python python-3.x tkinter pip requirements.txt


    【解决方案1】:

    Python 的标准库被称为标准库,因为它是Python 的标准。也就是说,如果没有安装标准库,那么python环境根本就不是python。

    标准库与每个 Python 版本一起作为此版本的一部分进行测试和发布(而不是作为添加或扩展)。

    所以,是的,如果用户安装了 Python,您可以期望这些库存在。顾名思义。


    关于内置库的升级:不,你不能这样做。因为它们是 python 设置的一部分,而不是应用程序环境的一部分。 Python 与这些库中的特定代码非常紧密地绑定在一起。所有 python 应用程序和库都希望这些库具有相同的行为,即使它们有问题。

    除此之外,您不能安装与 python 的内置函数之一同名的模块/包,因为它会在导入时产生歧义,并且可能会混淆/破坏所有其他依赖它的库(或更糟, 系统应用程序,如果你将它安装到系统 python 中)。

    但是,在某些情况下,您可以找到某些库的backports。通常,它们从 py3 向后移植到 py2。当然,他们的名字已经改变了。

    例如,您可以查看 concurrent.features 库,它是 py3.2+ 中的一个方便的内置函数,但在 py2.7 中没有。


    UPD: 虽然,正如 @JulienPalard 在 cmets 中所暗示的那样,一些操作系统发行版可以拆分这个标准库以简化二进制依赖关系:例如,在 Debian 上,Tkinter 将作为 python3-tk 单独安装.

    从二进制 OS 打包的角度来看,这确实是有道理的:如果您根本没有 UI 并且想要节省磁盘空间,则不值得安装 python 库的 UI 部分。

    但是,您仍然无法通过pip 安装它。因为这个包没有打包并且在 PyPI 上单独可用。这种标准库分离是由选定的操作系统发行版进行的,并且仅通过该操作系统发行版的方式来解决。

    【讨论】:

    • Debian 在他们的 python3 包中没有提供 tkinter,他们有一个单独的 python3-tk 包以避免对最小设置的依赖。
    • @JulienPalard 谢谢!我已将此添加到答案中。忘了python生态系统之外的东西可能会有所不同......
    • 谢谢! @SergeyVasilyev 这是否意味着我只希望 Debian 用户在安装我的软件包时安装了 Tkinter?
    • @WilliamV。是的。在最好的情况下,您可以在开始时检查一次,并向他们显示漂亮的错误消息和建议apt-get install python3-tk(或该操作系统所需的任何内容)。但不值得对每个模块进行此类检查。如果您将您的应用程序作为这些操作系统的二进制包分发,那就更好了,这仅取决于 python3-tk 或类似的。
    【解决方案2】:

    pip 安装来自pypi 的包,它不公开捆绑到 Python 中的标准库。

    所以理论上你应该信任你的用户环境,如果他们有 Python,他们应该有整个标准库。

    但是一些发行版出于某些原因将 Python 拆分为几个包(一个最小的 Debian 已经依赖于 Python,但他们不希望 Python 拉 tk 拉 libx11 拉生命、宇宙和一切)。

    所以在实践中会有一些包,你可以信任发行版,比如time 将永远在这里。并且某些软件包可能不在这里,例如tkinter,在这种情况下,您可能希望用tryimport tkinter 包围起来以报错“看起来您的发行版默认不提供tk,请安装它。 ”。

    请放心,您不必将每个导入都用 try 语句括起来,以防万一某些发行版拆分了 stdlib,只需 tkinter

    【讨论】:

    • 感谢try 声明的创意。我必须将其合并到我的代码中。
    猜你喜欢
    • 1970-01-01
    • 2018-04-14
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多