如何使用pip更新Python标准库包?

4
我正在为我的Python项目创建一个requirements.txt文件。当有人通过pip安装我的项目时,我希望pip也会下载Python标准库中的Tkintertime模块。
我使用命令pip freeze列出了所有当前安装的Python包,但当我滚动到T部分时,我无法在列表中找到Tkintertime。然后我尝试使用命令pip install Tkinter来安装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安装这些模块,或者我只能相信用户已经安装好了Tkintertime,因为他们已经安装了Python?
欢迎并感谢所有的帮助!
2个回答

5
Python的标准库被称为“标准库”,因为它是Python的一个标准。换句话说,如果没有安装“标准库”,那么Python环境根本不是Python。
标准库会随着每个Python版本一起进行测试和发布,作为该版本的一部分(而不是附加或扩展)。
因此,是的,如果用户已经安装了Python,您可以期望这些库存在。这就是定义。
关于内置库的升级:不行,因为它们是 Python 安装程序的一部分,而非应用程序环境的一部分。Python 与这些库中特定代码紧密绑定。所有 Python 应用程序和库都期望这些库具有相同的行为,即使它们存在缺陷。
此外,您不能安装与 Python 内置函数同名的模块/包,因为这会在导入时产生歧义,并且可能会混淆/破坏所有其他依赖它的库(或更糟,如果您将其安装到系统 Python 中,则会影响系统应用程序)。
但是,在某些情况下,您可以找到一些库的后端版本。通常,它们是从 Py3 返回到 Py2 的。当然,它们的名称已经改变了。
例如,您可以查看 Py3.2+ 中方便的内置库 concurrent.features,但在 Py2.7 中不存在。
更新: 正如@JulienPalard在评论中提到的那样,一些操作系统发行版可能会将此标准库分割以简化二进制依赖关系:例如,在Debian上,Tkinter将被单独安装为python3-tk。

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

但是,您仍然无法通过 pip 安装它。因为此软件包未经过打包并可在PyPI上单独使用。这种标准库分离是由选定的操作系统发行版完成的,并且仅通过该操作系统发行版的手段解决。


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

4

pippypi 安装软件包,而该站点没有公开标准库,标准库被打包进 Python 中。

因此理论上您应该信任用户的环境,如果他们安装了 Python,则应该拥有整个标准库。

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

因此在实践中,某些软件包将会存在,您可以相信这些发行版,例如 time 将永远存在。有些包可能不会存在,例如 tkinter,在这种情况下,您可以使用 try 来包围 import tkinter 以报告一个友好的错误消息:“看起来您的发行版默认没有提供 tk,请安装它。”

请放心,您不必对每个导入语句都加上 try 语句,只需要对 tkinter 进行处理即可。


谢谢你提供 try 语句的想法。我需要将它融入到我的代码中。 - William V.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接