web-dev-qa-db-ja.com

C / C ++の依存関係をPythonパッケージに含める最善の方法は?

作業中のPythonライブラリに依存関係として fastparquet を含めたいのですが、ビルドするにはMicrosoft Visual C++が必要です。ここでの目標は、エンドユーザーがPyPiを介して、またはpip install git+(url)ワンライナーを使用してライブラリを簡単にインストールできるようにすることです。コンパイル済みのfastparquetバイナリ用のピップホイールを見つけました here ですが、これは同じCPUアーキテクチャを持つユーザーにとっての解決策にすぎません。

私は基本的に、エンドユーザーがライブラリを実行するためにビルドツールを必要とせずにC++依存の拡張機能を含めるための良い方法があるかどうかを尋ねていますか?

3
chaostheory

ありえない。 PythonモジュールにC++の依存関係を含めることにより、プラットフォームの独立性とパフォーマンスをトレードオフすることになります。そのトレードオフが価値があるかどうかを判断する必要があります。

もしそうなら、あなたは本当に2つのPythonパッケージング形式の間での選択肢しかありません:

  • エンドユーザー自身がコンパイルする必要があるが、潜在的に移植可能なソースパッケージ
  • プラットフォームに固有のプリコンパイルされたホイール(Pythonバージョン、OS、snd CPUアーキテクチャ)

両方の利点を組み合わせる魔法の中間形式はありません(ネイティブコードをWebAssemblyにコンパイルするなどの非常に珍しい手法を数えない限り、Pythonはこのための適切なプラットフォームを提供しません) 。

あなたができることは、さまざまなOSとPython=バージョンを説明するために、ホストされたCIサービスを使用してパッケージの大きなマトリックスを簡単に生成することです。

ホイールは、直接取り付けた場合にのみ機能します。パッケージインデックスを介して(ただし、パブリックPyPIである必要はありません)、または.whlファイルを直接インストールする場合。ネイティブパーツを個別のパッケージに移動することはできますが、gitからパッケージをインストールするには、実質的にソースパッケージであるため、常にコンパイルが必要です。

ちなみに、お使いのソフトウェアがWindows固有である場合(他の理由でVisual Studioがハードに依存する理由)、Windowsは事実上x86-64プロセッサでのみ実行されるため、プラットフォームの独立性は問題になりません。

3
amon