Red Hat Training

A Red Hat training course is available for RHEL 8

第 43 章 处理 Python 脚本中的解释器指令

在 Red Hat Enterprise Linux 8 中,可执行 Python 脚本应该使用解释器指令(也称为 hashbangs 或 shebangs),该指令至少明确指定了主 Python 版本。例如:

#!/usr/bin/python3
#!/usr/bin/python3.6
#!/usr/bin/python2

在构建任何 RPM 软件包时, /usr/lib/rpm/redhat/brp-mangle-shebangs buildroot 策略(BRP)脚本会自动运行,并尝试在所有可执行文件中更正解释器指令。

BRP 脚本在遇到带有模糊解释器指令的 Python 脚本时会产生错误,例如:

#!/usr/bin/python

或者

#!/usr/bin/env python

43.1. 修改 Python 脚本中的解释器指令

修改 Python 脚本中导致 RPM 构建时构建错误的解释器指令。

先决条件

  • Python 脚本中的一些解释指令会导致构建错误。

流程

要修改解释器指令,请完成以下任务之一:

  • 应用 platform-python-devel 软件包中的 pathfix.py 脚本:

    # pathfix.py -pn -i %{__python3} PATH

    请注意,可以指定多个 PATHs。如果 PATH 是一个目录, pathfix.py 将递归扫描与模式 ^[a-zA-Z0-9_]+\.py$ 匹配的 Python 脚本,而不只是那些带有模糊解释器指令的脚本。在 %prep 部分添加这个命令,或者在 %install 部分末尾添加这个命令。

  • 修改打包的 Python 脚本,使其符合预期格式。为此, pathfix.py 也可以在 RPM 构建过程之外使用。当在 RPM 构建之外运行 pathfix.py 时,将上面示例中的 %{__python3} 替换为解释器指令的路径,如 /usr/bin/python3

如果打包的 Python 脚本需要 Python 3.6 以外的版本,请调整前面的命令使其包含所需的版本。

43.2. 更改自定义软件包中的 /usr/bin/python3 解释器指令

默认情况下, /usr/bin/python3 格式的解释器指令被从 platform-python 软件包中指向 Python 的解释器指令替代,该指令用于使用 Red Hat Enterprise Linux 的系统工具。您可以更改自定义软件包中的 /usr/bin/python3 解释器指令,以指向从 AppStream 软件仓库安装的 Python 的特定版本。

流程

  • 要为 Python 的特定版本构建您的软件包,请将相应的 python 软件包的 python*-rpm-macros 子软件包添加到 SPEC 文件的 BuildRequires 部分。例如,对于 Python 3.6,包括以下行:

    BuildRequires:  python36-rpm-macros

    因此,自定义软件包中的 /usr/bin/python3 解释器指令会自动转换为 /usr/bin/python3.6

注意

要防止 BRP 脚本检查和修改解释器指令,请使用以下 RPM 指令:

%undefine %brp_mangle_shebangs