6

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 ではなく、すべてがうまくいくと思います。

だから私の質問は:

  1. setup.py に、コンパイルされた Cython ファイルをソース ファイルと同じ場所に配置するように指示する何らかの設定がありますか?
  2. または、コンパイルされたファイルを必要な場所にコピーする方法はありますが、ホイールは非純粋なものとしてビルドされますか?
  3. それとも、これについて間違った方法で行っていますか。コンパイル済みのパッケージを別の場所からプルするように Python コードを変更する必要がありますか? (それは私には正しくないようです。)
  4. [編集] または、コンパイルされたバイナリ .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},
      ...

ありがとう!ブライアン

4

2 に答える 2

3

同様の問題がありましたが、あなたにも役立つ解決策を見つけました。

の公式の Python ドキュメントからdistutils.core.Extensionname引数は次のとおりです。

パッケージを含む拡張機能の完全な名前。ファイル名やパス名ではなく、Python のドット付きの名前

したがって、次のように変更するsetup.pyと:

...

extensions = [
    Extension(name='mpf.mc.core.audioaudio_interface',  # using dots!
              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),

...

必要な場所にコンパイルされたバイナリがあります。

于 2016-11-26T16:42:06.553 に答える
2

コマンドに追加する差し迫った問題を解決する回避策を見つけました--plat-namepython setup.py bdist_wheel(これは wheel 0.27.0 で追加されました。以前のすべての検索で出てこなかった理由がわかりません。)

したがって、これは私のリストの項目 2 を介して私の問題を解決します。pyx を .pyd または .so にコンパイルし、それを適切な場所にコピーしてから--plat-name、プラットフォーム固有のホイールを作成するために使用します。

ただし、Cython モジュールをさらに追加する場合、コンパイルしてから手動で元の場所にすべてコピーするか、またはそれらをコンパイルして元の場所に自動的に移動する方法があるため、私の質問はまだ残っています。また、私が行っている方法には、2 つの異なる setup.py ファイル (1 つはコンパイル用、もう 1 つはパッケージのインストール用) が含まれます。

したがって、将来の検索者のためにこれをここに追加しますが、私の最初の質問はまだ残っています.

于 2016-02-19T10:55:47.030 に答える