12

特定のプラットフォームでパッケージを要求するように setuptools または distribution に指示する方法はありますか?

私の特定のケースではreadline、Unix システムの標準ライブラリの一部として提供される を使用していますが、Windows ではpyreadlineその機能を置き換えるモジュールが必要です (この質問を参照)。要件に入れると、まったく役に立たないUnixシステムにもインストールされます。

4

4 に答える 4

22

当時、 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 を使用できないプラットフォームでもパッケージをインストールできるようにします。

于 2015-10-05T18:36:06.040 に答える
9

2013 年に私が最初に回答をここに書いたとき、まだPEP 496 – Environment MarkersPEP 508 – Dependency specification for Python Software Packagesがありませんでした。これで、答えは次のようになります: 環境マーカーを に入れますsetup_requires:

setup_requires = [
    'foo',
    'bar',
    'pyreadline; sys_platform == "win32"',
]

setup(
    # ...
    setup_requires=setup_requires,
)

これは、2016 年 5 月にリリースされたsetuptools20.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,
)
于 2013-04-17T08:49:50.777 に答える