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