6.6. Python スクリプトでのインタープリターディレクティブの処理
Red Hat Enterprise Linux 9 では、実行可能な Python スクリプトは、少なくとも主要な Python バージョンを明示的に指定するインタープリターディレクティブ (別名 hashbangs または shebangs) を使用することが想定されます。以下に例を示します。
#!/usr/bin/python3
#!/usr/bin/python3.9
#!/usr/bin/python3.11
#!/usr/bin/python3.12
/usr/lib/rpm/redhat/brp-mangle-shebangs BRP (buildroot policy) スクリプトは、RPM パッケージをビルドする際に自動的に実行され、実行可能なすべてのファイルでインタープリターディレクティブを修正しようとします。
BRP スクリプトは、以下のようにあいまいなインタープリターディレクティブを含む Python スクリプトを検出すると、エラーを生成します。
#!/usr/bin/python
または
#!/usr/bin/env python
6.6.1. Python スクリプトでのインタープリターディレクティブの変更 リンクのコピーリンクがクリップボードにコピーされました!
次の手順を使用して、RPM ビルド時にビルドエラーが発生する Python スクリプト内のインタープリターディレクティブを変更します。
前提条件
- Python スクリプトのインタープリターディレクティブの一部でビルドエラーが発生する。
手順
インタープリターディレクティブを変更するには、以下のタスクのいずれかを実行します。
SPEC ファイルの
%prepセクションで次のマクロを使用します。# %py3_shebang_fix SCRIPTNAME …SCRIPTNAME には、任意のファイル、ディレクトリー、またはファイルおよびディレクトリーのリストを指定できます。
結果として、リストしたすべてのファイルと、リストしたディレクトリー内のすべての
.pyファイルのインタープリターディレクティブが、%{python3}を指すように変更されます。元のインタープリターディレクティブの既存のフラグは保持され、%{py3_shebang_flags}マクロで定義された追加のフラグが追加されます。SPEC ファイルの%{py3_shebang_flags}マクロを再定義すると、追加されるフラグを変更できます。python3-develパッケージからpathfix.pyスクリプトを適用します。# pathfix.py -pn -i %{python3} PATH …複数のパスを指定できます。
PATHがディレクトリーの場合、pathfix.pyはあいまいなインタープリターディレクティブを持つスクリプトだけでなく、^[a-zA-Z0-9_]+\.py$のパターンに一致する Python スクリプトを再帰的にスキャンします。上記のコマンドを%prepセクションまたは%installセクションの最後に追加します。-
パッケージ化した Python スクリプトを、想定される形式に準拠するように変更します。この目的のために、RPM ビルドプロセスの外部で
pathfix.pyスクリプトを使用することもできます。pathfix.pyを RPM ビルド以外で実行する場合は、前述の例の%{python3}を、/usr/bin/python3または/usr/bin/python3.11などのインタープリターディレクティブのパスに置き換えます。