【译文】减轻 Python 打包的痛苦

坚持使用一种方法来安装和运行 Python,可以避免打包过程中的痛苦。

Python 打包不为人知的小秘密

现在,Python 3 过渡期已经结束,Guido 正在努力让语言变得更快,社区抱怨的新话题是打包。

关于打包有很多可说的,因为它涵盖了构建包、发布包和其他方面,但这并不是大多数用户所苦恼的。

问题在于,当他们想使用软件包时,却有一只无形的手从终端里伸出来,狠狠地扇了他们一巴掌,因为他们竟敢想提高工作效率。本文将着重为你解决这个问题。总之,会解决很多问题。

但关键在于:你迄今为止所尝试的方法并不奏效。事实上,关于这个话题的大多数建议都不会对你有帮助。

这是因为 Python 打包的肮脏秘密是,大多数问题……并非来自打包。

它们来自于引导 Python 的深层问题,即查找、安装、配置和运行 Python。

15 年来,我尝试了阳光下的所有方法,有专家也有初学者,有专业人士也有业余爱好者,但没有 “唯一正确的方法”。

但对大多数人来说,有一种方法可以减少失败的次数。

在本文中,我将只告诉你需要遵循的步骤。

1.不要安装最新的 Python 主版本

是的,最新版本很闪亮。它速度更快,功能很酷,闻起来很香。我并不是说你不应该试一试,玩一玩。

但是,不要在任何项目中使用它。

因此,如果 Python 3.11 是最新的主要版本,最多使用 3.10。当然,您也可以使用旧版本。如果可能的话(我知道人们不想每年都更新 Python),将目标下调到最少 4 个版本。在我们的例子中,最低到 3.7。

如有疑问,请查看 Python 状态页面

在这个页面中,”feature “指的是当前正在开发的版本,”bugfix “指的是将要修复 bug 的版本,”security “指的是将要修复安全问题的版本,而 “end-of-line “指的是不再更新的版本。

2.A. 在 Windows 和 Mac 上,使用官方安装程序

有很多安装 Python 的方法,而如何选择安装方法非常重要。

是使用 Homebrew、Windows 商店,还是使用 Anaconda?

不需要。

请访问 python.org,使用他们的 Python Windows 安装程序Mac 安装程序

这就是要做的。

另外,因为我知道有些用户不得不使用 Anaconda,所以在本文末尾有专门的章节介绍它。

2.B. 在 Linux 上,使用官方软件源

使用发行版自带的官方工具来安装 Python,如 “apt”、”yum”、”dnf “等。

您将受限于版本库中的 Python 版本,但请不要使用 pyenv 来解决这个问题。

如果你碰巧使用的是 Ubuntu,那你就走运了:你可以使用 deadsnake PPA 来扩展你可以使用的版本数量。

如果你使用的是 Red Hat,也可以使用 EPEL

您可以在 Windows/Mac 上开发,然后在 Linux 上部署。在这种情况下,请检查 Linux 机器上的可用版本,并在 Windows 上安装相同的版本,而不是相反。

3.安装时使用 pip,而且只能使用 pip

不要使用 conda。

不要使用 poetry、pipenv、pdm、easy_install

不要使用 pipx。pipx 不是 pip。

不要使用 apt、yum 等。

4.始终在虚拟环境中使用 pip

既然你正在阅读这篇文章,这很可能意味着你不具备必要的知识来对该规则进行例外处理。

所以,不要这样做。

这条规则是最重要的一条。

如果需要安装任何东西,都应该在虚拟环境中进行。

即使是安装 black、jupyter、mypy 或任何你现在正在考虑的东西,也要在虚拟环境中进行。

最重要的一点是,如果你不能 100% 确定自己在安装时使用的是虚拟环境,那么你首先要做的就是确保自己使用的是虚拟环境。

如果你输入的是”–user”,那么你就没有在虚拟环境中安装。

如果输入的是 “sudo”,则不是在虚拟环境中安装。

一旦在虚拟环境中安装了设备,要使用它们,就必须在相同的环境中。因此,也要在虚拟环境中运行所有其他命令。不仅仅是 pip。

如果你不知道什么是虚拟环境或如何使用虚拟环境,你猜对了,我们会在另一篇文章中介绍。

是的,这很烦人。你只想写代码,而不是处理这些讨厌的虚拟环境。为什么它不能像 cargo 或 npm 一样工作,做简单的事情呢?

答案其实很长。

但现在的情况是,如果没有虚拟环境,你根本无法可靠地安装任何东西。

因此,你有两个选择。不使用虚拟环境,受尽折磨。使用虚拟环境,吃点苦头。

5.要创建虚拟环境,请使用 “venv”,而且只能使用 “venv”。

“venv “是大多数 Python 安装程序自带的命令,您应该使用它来创建新的虚拟环境。

还有其他一些命令,如 “virtualenv “和 “virtualenvwrapper “1。

不要使用它们。

还有其他工具,如 pipx、pdm、poes 和 pipenv。

不要使用它们。

当然,anaconda 自带 “env “子命令。

你懂的:别用它。

重要的是,”venv “与来自 python.org 的 Python 安装程序捆绑在一起,但在 Linux 下,你必须安装一个特殊的软件包。

6.运行 Python 命令时使用”-m”

“-m “是 “python “命令的一个标志,似乎很少有用户知道它。它可以让你运行任何可导入的 Python 模块,无论你在哪里。因为大多数命令都是 Python 模块,所以我们可以用它来表示 “运行这个特定 python 的 X 模块”。

例如

不要执行 :

pip install

而是:

python -m pip install

不要执行 :

black

而是:

python -m black

不要执行 :

jupyter notebook

而是:

python -m jupyter notebook

即使是在虚拟环境中,你也应该这样做,尽管人们会告诉你一切。

是的,这很烦人。你只是想编码,而不是处理这个讨厌的”-m”。为什么不能开箱即用?

答案很长。

但目前的情况是,没有办法在不使用”-m “的情况下可靠地运行任何 python 命令。

因此,你有两个选择。不使用”-m”,结果会很痛苦。使用”-m”,吃点苦头。

6.创建虚拟环境时,要明确使用的 Python

在计算机上安装多个 Python 是很常见的事情。有时您并不知道。

在创建虚拟环境时,应始终指定任务要使用哪种 Python,因为该环境将永远使用这种特定的 Python。

在 Windows 中,这意味着要使用 “py “命令。python.org 安装程序自带了这个命令,它可以列出当前安装在机器上的所有 Python:

py --list-paths

你可能会看到这样的内容:

 -3.9        C:\Python39\python.exe
 -3.8        C:\Python38\python.exe *
 -3.7        C:\Python37\python.exe

然后,您可以选择运行哪个 Python:

py -X.Y

例如,运行 Python 3.7:

py -3.7
>>> print('Hello')
Hello

在 Linux 和 Mac 上,必须使用版本后缀,通常是 “pythonX.Y”。

例如,运行 Python 3.7:

python3.7
>>> print('Hello')
Hello

在这两种情况下,这些都是选择现有 Python 并运行它的说明。它假定 Python 已安装在机器上。它无法运行之前未安装的 Python。

最重要的是:

如果您遵循了目前的所有步骤,这就意味着您将使用 “venv “和”-m”。

因此,要创建虚拟环境,你最终会键入一些可怕的命令。

例如,在 Windows 上:

"py -3.8 -m venv .venv"  

例如,在 Linux 和 Mac 上:

"python3.8 -m venv .venv"  

这看起来很可怕。但就是这样。

是的,这很烦人。你只是想写代码,而不是处理曼多里安-西格。为什么我们非要写一些连 Chat GPT 都不推荐的东西呢?

这个问题的答案很长。

但现在的情况是,如果不这样做,就无法可靠地创建虚拟环境。

所以,你有两个选择。继续按以前的方法操作,但会吃很多苦头。或者把这个神奇的字符串放在一个文件中,每次需要时复制/粘贴它,这样就可以少受一点苦。

让我们回顾一下

  1. 不要安装最新的 Python 主版本
  2. 在 Windows 和 Mac 上只使用 python.org 安装程序,在 Linux 上只使用官方软件源。
  3. 切勿在虚拟环境外安装或运行任何程序
  4. 将自己限制在基本功能范围内:”pip” 和 “venv”
  5. 如果运行命令,请使用”-m”。
  6. 创建虚拟环境时,明确说明使用哪种 Python

如果觉得所有这些都很疯狂,请等待其他文章来解释如何操作。

您可能已经注意到,我们几乎从未讨论过任何与打包相关的内容。然而,这样做将大大减少大多数用户认为是打包问题的所有问题。

说到这里,很多人可能也会反对这些建议。

因此,现在是解释这些建议的来龙去脉的最佳时机。

如果您被迫必须使用 Anaconda 怎么办?

必须 100% 确定您必须使用 Anaconda。我遇到过很多人,他们以为自己必须使用,但按照上述步骤操作后,才发现他们实际上并不需要。自从在 pypi 中引入轮子文件(wheel files)后,以前安装图形用户界面工具包或科学堆栈等软件包简直就是一场噩梦,现在却变得轻而易举。

不过,我知道有些人还是不得不这么做。

你可能被某个机器学习的科学怪人项目困住了,或者你公司的政策是只用 Anaconda 而不用其他软件。

在这种情况下,你仍然可以通过确保留在 Anaconda 泡沫中来生存。

使用 “conda”,而且只能使用 “conda”。

不要使用 “pip “或 “venv”。更不要将 “conda “与 “pip “或 “venv “混用。

这将把你的视野限制在 Anconda 频道中的可用内容上,但这是保持清醒的唯一办法。

创建一个虚拟环境并在其中执行所有操作的建议仍然有效,但要使用 “conda “创建。

本文文字及图片出自 Relieving your Python packaging pain

余下全文(1/3)
分享这篇文章:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注