web-dev-qa-db-ja.com

pythonホイールをビルドするときにプラットフォーム固有にする方法は?

setup.pyにいくつかのカスタムインストールコマンドが含まれているpython2パッケージに取り組んでいます。これらのコマンドは実際にいくつかのRustコードを作成し、pythonパッケージに移動されるいくつかの.dylibファイルを出力します。

重要な点は、Rustコードがpythonパッケージの外にあるということです。

setuptoolsは、pythonパッケージが純粋なpythonまたはプラットフォーム固有(たとえば、いくつかのC拡張機能が含まれている場合))であるかどうかを自動的に検出することになっています。私の場合、python setup.py bdist_wheelを実行すると、生成されたホイールは純粋なpython Wheel:<package_name>-<version>-py2-none-any.whlとしてタグ付けされます。このコードを実行する必要があるため、これは問題があります。プラットフォームが異なるため、プラットフォームごとに1つのホイールを生成する必要があります。

ホイールをビルドするときに、ビルドをプラットフォーム固有にする方法はありますか?

13
Adrien Ball

これが私が通常見ているコードです wsgi

基本的なアプローチは次のとおりです。

setup.py

# ...

try:
    from wheel.bdist_wheel import bdist_wheel as _bdist_wheel
    class bdist_wheel(_bdist_wheel):
        def finalize_options(self):
            _bdist_wheel.finalize_options(self)
            self.root_is_pure = False
except ImportError:
    bdist_wheel = None

setup(
    # ...
    cmdclass={'bdist_wheel': bdist_wheel},
)

root_is_pureビットはホイール機械に非purelibを構築するように指示します(pyX-none-any)ホイール。 binaryプラットフォーム固有のコンポーネントはあるが、はないと言うことで、 fancier を取得することもできます。 cpython abi固有のコンポーネント。

10
Anthony Sottile

モジュールsetuptoolsdistutils、およびwheelは、ext_modulesがあるかどうかをチェックすることにより、pythonディストリビューションが純粋であるかどうかを判断します。

独自に外部モジュールを構築する場合でも、それをext_modulesにリストして、構築ツールがそれが存在することを認識できるようにすることができます。秘訣は、ソースの空のリストを提供して、setuptoolsdistutilsがそれを構築しようとしないようにすることです。例えば、

setup(
    ...,
    ext_modules=[
        setuptools.Extension(
            name='your.external.module',
            sources=[]
        )
    ]
)

このソリューションは、bdist_wheelコマンドにパッチを適用するよりもうまく機能しました。その理由は、bdist_wheelが内部でinstallコマンドを呼び出し、そのコマンドがext_modulesの存在を再度チェックして、purelibまたはplatlibインストールのどちらかを決定するためです。 。外部モジュールをリストしないと、ホイール内のpurelibサブフォルダーにlibがインストールされてしまいます。これは、auditwheel repairを使用するときに問題を引き起こします。これは、拡張機能がpurelibフォルダーにインストールされていることを訴えます。

0
paulinus