特定のプラットフォームでパッケージを要求するように setuptools または distribution に指示する方法はありますか?
私の特定のケースではreadline
、Unix システムの標準ライブラリの一部として提供される を使用していますが、Windows ではpyreadline
その機能を置き換えるモジュールが必要です (この質問を参照)。要件に入れると、まったく役に立たないUnixシステムにもインストールされます。
特定のプラットフォームでパッケージを要求するように setuptools または distribution に指示する方法はありますか?
私の特定のケースではreadline
、Unix システムの標準ライブラリの一部として提供される を使用していますが、Windows ではpyreadline
その機能を置き換えるモジュールが必要です (この質問を参照)。要件に入れると、まったく役に立たないUnixシステムにもインストールされます。
当時、 Martijn Pietersの回答は完全に有効でしたが、Python のパッケージングはその後大きく変化しました。
パッケージを配布するための推奨される形式は、wheelsを使用することです*。wheel を使用すると、インストール中に Python コードを実行することはできません。
Wheel は、PEP 0427で指定されているメタデータ バージョン 2 を使用します。環境マーカーを使用して、プラットフォーム固有の依存関係を指定できます。
Setuptools を使用すると、これらの環境マーカーをextras_require
キーとして指定できます。pyreadline
次のスクリプト例は、Windows システムの場合は に依存しpyxdg
、Linux ディストリビューションの場合は に依存します。
#!/usr/bin/env python
from setuptools import setup
setup(
name='spam',
version='0.0.1',
extras_require={
':sys_platform == "win32"': [
'pyreadline'
],
':"linux" in sys_platform': [
'pyxdg'
]
})
*また、sdist をリリースして、wheel を使用できないプラットフォームでもパッケージをインストールできるようにします。
2013 年に私が最初に回答をここに書いたとき、まだPEP 496 – Environment MarkersとPEP 508 – Dependency specification for Python Software Packagesがありませんでした。これで、答えは次のようになります: 環境マーカーを に入れますsetup_requires
:
setup_requires = [
'foo',
'bar',
'pyreadline; sys_platform == "win32"',
]
setup(
# ...
setup_requires=setup_requires,
)
これは、2016 年 5 月にリリースされたsetuptools
20.6.8でサポートされています (サポートはバージョン 20.5で導入されましたが、その間のリリースで一時的に無効になりました)。
setuptools は、実行時にこれらの要件をインストールするために使用することに注意してください。これは、プロジェクトをインストールするeasy_install
ために使用する場合の構成が困難です。pip
ビルド時の依存関係を処理するために setuptools を使用せず、 PEP 518 – Specifying Minimum Build System Requirements for Python Projects の推奨に従ってファイルを使用することをお勧めしpyproject.toml
ます。ビルド時の依存関係を持つ PEP 518 ビルドシステムを使用するということは、次のようなファイルを作成することを意味します。pyproject.toml
[build-system]
requires = [
"setuptools",
"wheel",
"foo",
"bar",
"pyreadline; sys_platform == "win32",
]
これは と同じリストですsetup_requires
が、setuptools
とがwheel
追加されています。この構文は、2018 年 3 月にリリースされたバージョン 10.0.0pip
の時点でサポートされています。
2013年からの私の古い答えは次のとおりです。
setup.py
単なる python スクリプトです。そのスクリプトで動的な依存関係を作成できます。
import sys
setup_requires = ['foo', 'bar']
if sys.platform() == 'win32':
setup_requires.append('pyreadline')
setup(
# ...
setup_requires=setup_requires,
)