Cython モジュールを含む Python 3.4 アプリ用の setup.py パッケージをビルドしようとしています。私の計画は、Cython を必要とする setup.py ファイルを用意し、.pyx ファイルをコンパイルして、通常は Win32 (x86 & x64) と Mac でそれを実行し、プラットフォーム ホイールを生成して PyPI にアップロードするという考えです。通常のユーザーは、Cython を必要とせず、何かをコンパイルする必要もありません。
現在、setup.py スクリプトを取得して .pyd ファイルをビルドできますが、ビルドされた .pyd ファイルが、必要な元の .pyx ファイルと同じ場所に配置されません。
.pyd ファイルを手動でコピーしようとしましたが、bdist_wheel を介してホイールを生成すると、プラットフォームによってビルドされた .pyx ファイルのバージョンが異なるため、間違っていると思われる純粋な Python ホイールが得られます。また、クラスをサブクラス化し、False を返すようにDistribution
強制しようとしましたが (ここで説明されているように、車輪の構築セクションで説明されています)、うまくいきません。(それでも純粋な Python ホイールを生成します。)is_pure()
setup.py スクリプトを使用してコンパイル済みファイルを適切な場所に配置できれば、ホイールは純粋な Python ではなく、すべてがうまくいくと思います。
だから私の質問は:
- setup.py に、コンパイルされた Cython ファイルをソース ファイルと同じ場所に配置するように指示する何らかの設定がありますか?
- または、コンパイルされたファイルを必要な場所にコピーする方法はありますが、ホイールは非純粋なものとしてビルドされますか?
- それとも、これについて間違った方法で行っていますか。コンパイル済みのパッケージを別の場所からプルするように Python コードを変更する必要がありますか? (それは私には正しくないようです。)
- [編集] または、コンパイルされたバイナリ .pyd / .so / .dylib をパッケージに入れ、実行時にアーキテクチャに基づいて適切な .pyd を取得するロジックを追加してから、純粋な Python ホイールを用意する必要がありますか? (それも私には正しくないようです。)
セットアップの詳細: setup.py スクリプトで setuptools (distutils ではない) を使用しています。私のsetup.pyのスニペットはここにあります(関連するものに保つために多くのものを削除しています):
from setuptools import setup, Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext
...
extensions = [
Extension(name='audio_interface',
sources=['mpf/mc/core/audio/audio_interface.pyx'],
include_dirs=include_dirs,
library_dirs=library_dirs,
libraries=libraries,
extra_objects=extra_objects,
extra_compile_args=extra_compile_args,
extra_link_args=extra_link_args),
...
setup(
...
ext_modules=cythonize(extensions),
cmdclass= {'build_ext': build_ext},
...
ありがとう!ブライアン