「Python パッケージガイドライン」の版間の差分
(インストール方法を翻訳して追加) |
(チェックを翻訳して追加) |
||
| 134行目: | 134行目: | ||
export SETUPTOOLS_SCM_PRETEND_VERSION=$pkgver |
export SETUPTOOLS_SCM_PRETEND_VERSION=$pkgver |
||
| + | |||
| + | == チェック == |
||
| + | |||
| + | {{Warning|{{ic|tox}} は、{{ic|tox}} の実行中にPyPIからダウンロードされた繰り返し可能な設定をテストするために明示的に設計されており、パッケージによってインストールされるバージョンをテストしません。これでは check 機能を持つ意味がありません。}} |
||
| + | |||
| + | テストスイートを提供するほとんどの Python プロジェクトは、nosetests または pytest を使用して、テストスイートを含むファイルまたはディレクトリの名前に {{ic|test}} を含むテストを実行します。一般に、テストスイートを実行するには、{{ic|nosetests}} または {{ic|pytest}} を実行するだけで十分です。 |
||
| + | |||
| + | {{bc| |
||
| + | check(){ |
||
| + | cd "$srcdir/foo-$pkgver" |
||
| + | |||
| + | # For nosetests |
||
| + | nosetests |
||
| + | |||
| + | # For pytest |
||
| + | pytest |
||
| + | } |
||
| + | }} |
||
| + | |||
| + | コンパイルされた C 拡張機能がある場合は、それを見つけてロードするために、Python の現在のメジャーバージョンとマイナーバージョンを反映する {{ic|$PYTHONPATH}} を使用してテストを実行する必要があります。 |
||
| + | |||
| + | {{bc|1= |
||
| + | check(){ |
||
| + | cd "$pkgname-$pkgver" |
||
| + | local python_version=$(python -c 'import sys; print("".join(map(str, sys.version_info[:2])))') |
||
| + | # For nosetests |
||
| + | PYTHONPATH="$PWD/build/lib.linux-$CARCH-cpython-${python_version}" nosetests |
||
| + | |||
| + | # For pytest |
||
| + | PYTHONPATH="$PWD/build/lib.linux-$CARCH-cpython-${python_version}" pytest |
||
| + | } |
||
| + | }} |
||
| + | |||
| + | 一部のプロジェクトでは、テストを実行するための {{ic|setup.py}} エントリポイントが提供されています。これは、{{ic|pytest}} と {{ic|nosetests}} の両方で機能します。 |
||
| + | |||
| + | {{bc| |
||
| + | check(){ |
||
| + | cd "$srcdir/foo-$pkgver" |
||
| + | |||
| + | # For nosetests |
||
| + | python setup.py nosetests |
||
| + | |||
| + | # For pytest - needs python-pytest-runner |
||
| + | python setup.py pytest |
||
| + | } |
||
| + | }} |
||
| + | |||
== ファイルの配置場所 == |
== ファイルの配置場所 == |
||
2023年6月28日 (水) 17:24時点における版
32ビット – CLR – クロス – Eclipse – Electron – Free Pascal – GNOME – Go – Haskell – Java – KDE – カーネル – Lisp – MinGW – Node.js – ノンフリー – OCaml – Perl – PHP – Python – R – Ruby – Rust – VCS – ウェブ – Wine
このドキュメントでは Python ソフトウェアの PKGBUILD を書くときの決まり事とガイドラインを提供します。
目次
パッケージの命名規則
Python 3 ライブラリモジュールの場合は、python-modulename を使用します。パッケージが Python エコシステムに強く結合されたプログラムを提供する場合にも、接頭辞を使用します (例: pip または tox) 他のアプリケーションの場合は、プログラム名のみを使用します。
アーキテクチャ
PKGBUILD#arch を参照してください。
C 拡張機能を含む Python パッケージはアーキテクチャに依存します。それ以外の場合は、アーキテクチャに依存しない可能性が高くなります。
[1] を使用してビルドされたパッケージは、setup.py の ext_modules キーワードを使用して C 拡張機能を定義します。
ソース
PyPI Web サイトからリンクされているダウンロード URL には、パッケージを更新する必要があるたびに PyPI Web サイトから取得する必要がある予測不可能なハッシュが含まれています。このため、PKGBUILD での使用には適していません。PyPI が提供 代替の安定したスキーム: PKGBUILD#source source=() 配列次の URL テンプレートを使用する必要があります。
- ソースパッケージ
https://files.pythonhosted.org/packages/source/${_name::1}/$_name/$_name-$pkgver.tar.gz- 純粋な Python wheel パッケージ
https://files.pythonhosted.org/packages/py2.py3/${_name::1}/$_name/${_name//-/_}-$pkgver-py2.py3-none-any.whl(バイリンガル – Python 2 および Python 3 互換)https://files.pythonhosted.org/packages/py3/${_name::1}/$_name/${_name//-/_}-$pkgver-py3-none-any.whl(Python 3 のみ)- ディストリビューション名にはダッシュを含めることができますが、wheel ファイル名での表現にはダッシュを含めることができないことに注意してください (ダッシュはアンダースコアに変換されます)
アーキテクチャ固有の wheel パッケージ
source_x86_64=('...')のように、アンダースコアとアーキテクチャ名を追加することで、アーキテクチャ固有の配列を追加できます。また、_py=cp310を使用して、Python バージョンを繰り返さないようにすることもできます。https://files.pythonhosted.org/packages/$_py/${_name::1}/$_name/${_name//-/_}-$pkgver-$_py-${_py}m-manylinux1_x86_64.whl
Python パッケージには通常、python- という接頭辞が付けられるため、pkgname の代わりにカスタムの _name 変数が使用されることに注意してください。この変数は一般に次のように定義できます。
_name=${pkgname#python-}
インストール方法
Python パッケージは通常、pip などの言語固有のパッケージ マネージャーを使用してインストールされます。このマネージャーは、オンラインリポジトリ (通常は PyPI) からパッケージを取得します。 Package Index) を作成し、関連ファイルを追跡します。
ただし、PKGBUILD 内から Python パッケージを管理するには、Python パッケージを一時的な場所 $pkgdir/usr/lib/python<Python) に インストール する必要があります。バージョン>/site-packages/$pkgname
standard metadata を使って pyproject.toml でビルドバックエンドを指定している Python パッケージでは、python-build と python-installer を使うのが最も簡単です。
古いパッケージでは、setuptools を使用することを指定できず、手動で呼び出す必要がある setup.py のみが提供される場合があります。
標準ベース (PEP 517)
標準ベースのワークフローは簡単です。python-build を使用して wheel をビルドし、python-installer を使用してそれを $pkgdir にインストールします。
makedepends=(python-build python-installer python-wheel)
build() {
cd "$_name-$pkgver"
python -m build --wheel --no-isolation
}
package() {
cd "$_name-$pkgver"
python -m installer --destdir="$pkgdir" dist/*.whl
}
場所
--wheelでは、wheel ファイルのみがビルドされ、ソースは配布されません。--no-isolationは、システムにインストールされているもの (dependsで指定したパッケージを含む) を使用してパッケージがビルドされることを意味します。デフォルトでは、ツールは分離された仮想環境にアクセスし、そこでビルドを実行します。--destdir="$pkgdir"により、パッケージファイル内ではなくホストシステムに直接インストールしようとすることが防止されます。これにより、権限エラーが発生します。--compile-bytecode=...または--no-compile-bytecodeをinstallerに渡すことができますが、デフォルトは賢明に選択されているため、これは必要ありません。
setuptools または distutils
pyproject.toml が見つからない場合、または [build-system] テーブルが含まれていない場合は、プロジェクトが セットアップ を使用する古いレガシー形式を使用していることを意味します。 setuptools または distutils を呼び出す .py ファイル。distutils は Python の standardlib に含まれていますが、setuptools がインストールされているということは、パッチ適用されたバージョンの distutils を使用することを意味することに注意してください。
makedepends=('python-setuptools') # unless it only requires distutils
build() {
cd "$_name-$pkgver"
python setup.py build
}
package() {
cd "$_name-$pkgver"
python setup.py install --root="$pkgdir" --optimize=1
}
場所:
--root="$pkgdir"は上記の--destdirと同様に機能します--optimize=1は、最適化されたバイトコードファイル (.opt-1.pyc) をコンパイルします。これにより、ファイルはホストシステム上で作成されるのではなく、pacman から要求、追跡できるようになります。--skip-buildを追加すると、build()関数で既に実行されているビルド ステップを再実行する不要な試行が最適化されます (該当する場合)
結果のパッケージに 非推奨の pkg_resources モジュールをインポートする 実行可能ファイルが含まれている場合は、setuptools を追加で指定する必要があります。分割された package_*() 関数の depends。 あるいは、PKGBUILD が Python の単一バージョンの Python パッケージのみをインストールする場合は、setuptools を makedepends から depends に移動する必要があります。
一部のパッケージは setuptools を使用しようとし、setuptools をインポートできない場合は distutils にフォールバックします。この場合、得られる Python メタデータがより適切になるように、setuptools を makedepends として追加する必要があります。
実行可能ファイル (distutils ではサポートされていない) が含まれているためにパッケージに setuptools をビルドする必要があるが、distutils のみをインポートする場合、ビルドすると警告が表示され、結果のパッケージは次のようになります。壊れている可能性があります (実行可能ファイルは含まれません):
/usr/lib/python3.8/distutils/dist.py:274: UserWarning: Unknown distribution option: 'entry_points' warnings.warn(msg)
アップストリームのバグは報告する必要があります。この問題を回避するには、文書化されていない setuptools 機能を使用できます。
# fails because of distutils python setup.py build # works by using a setuptools shim python -m setuptools.launch setup.py build
パッケージで python-setuptools-scm を使用する場合、パッケージはビルドされず、次のようなエラーが発生する可能性があります。
LookupError: setuptools-scm was unable to detect version for /build/python-jsonschema/src/jsonschema-3.2.0. Make sure you're either building from a fully intact git repository or PyPI tarballs. Most other sources (such as GitHub's tarballs, a git checkout without the .git folder) don't contain the necessary metadata and will not work.
SETUPTOOLS_SCM_PRETEND_VERSION をビルドするには、$pkgver を値として環境変数としてエクスポートする必要があります。
export SETUPTOOLS_SCM_PRETEND_VERSION=$pkgver
チェック
テストスイートを提供するほとんどの Python プロジェクトは、nosetests または pytest を使用して、テストスイートを含むファイルまたはディレクトリの名前に test を含むテストを実行します。一般に、テストスイートを実行するには、nosetests または pytest を実行するだけで十分です。
check(){
cd "$srcdir/foo-$pkgver"
# For nosetests
nosetests
# For pytest
pytest
}
コンパイルされた C 拡張機能がある場合は、それを見つけてロードするために、Python の現在のメジャーバージョンとマイナーバージョンを反映する $PYTHONPATH を使用してテストを実行する必要があります。
check(){
cd "$pkgname-$pkgver"
local python_version=$(python -c 'import sys; print("".join(map(str, sys.version_info[:2])))')
# For nosetests
PYTHONPATH="$PWD/build/lib.linux-$CARCH-cpython-${python_version}" nosetests
# For pytest
PYTHONPATH="$PWD/build/lib.linux-$CARCH-cpython-${python_version}" pytest
}
一部のプロジェクトでは、テストを実行するための setup.py エントリポイントが提供されています。これは、pytest と nosetests の両方で機能します。
check(){
cd "$srcdir/foo-$pkgver"
# For nosetests
python setup.py nosetests
# For pytest - needs python-pytest-runner
python setup.py pytest
}
ファイルの配置場所
ほとんどの Python パッケージは setup.py による distutils システムでインストールされます。ファイルは /usr/lib/python<python version>/site-packages/pkgname ディレクトリにインストールされます。
--optimize=1パラメータは.pyoファイルをコンパイルして pacman から追跡することができます。
もし pip (wheels などのインストールで必要であり、最近 Python コミュニティから一般に推奨されています) を使う場合は、次のフラグを忘れずに渡してください:
PIP_CONFIG_FILE=/dev/null pip install --isolated --root="$pkgdir" --ignore-installed --no-deps *.whl
PIP_CONFIG_FILE=/dev/nullは pip にフラグを追加するかもしれない{/etc,~/.config}/pip.confを無視します。--isolatedは pip にフラグを追加するかもしれない環境変数 (それと{/etc,~/.config}/pip/pip.conf) を無視します。--ignore-installedは https://github.com/pypa/pip/issues/3063 が解決されるまで必要です (フラグを指定しないと先に--userでインストールされていた場合でも pip はインストールをスキップしてしまいます)。--no-depsはメインパッケージと一緒に依存関係がパッケージされないことを保証します。
ノート
基本的に Python パッケージはアーキテクチャに依存しないので arch には any を指定します。
tests という名前のディレクトリをインストールしてはいけません。他の Python パッケージと衝突する可能性があります (例: /usr/lib/python2.7/site-packages/tests/)。
サンプル
サンプル PKGBUILD は こちら を見るか、abs[リンク切れ: パッケージが存在しません] パッケージに入っている /usr/share/pacman/PKGBUILD-python.proto ファイルを見て下さい。