第4章 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
4.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
などのインタープリターディレクティブのパスに置き換えます。