2017-03-07 8 views
1

コードはpybind11swigの両方でラップされていますが、私はpip installパッケージを正しく取得する方法についてのドキュメントを見つけることができません。pypiにswig/pybind11 C++プロジェクトを入れる方法

パイビンド11 seems to have issues that make it difficult to put code on pypi

Linux用のバイナリホイールを構築したいと思っています。& OSXですが、これについて多くのドキュメントが見つかりません。 Some people do this via travis and scriptingと思いますか?すべてのディストリビューションでホイールを作るためのプラグアンドプレイの方法はありますか?

答えて

1

情報が見つかりませんでした。 distutuisとその兄弟setuptoolsExtensionクラスを提供しています。バイナリのPython-C拡張モジュールをインストールする前にビルドすることができ、非Python以外のファイルはMANIFEST.inファイル経由で配布に含めることができます。 Pybind11に関してはヘッダーのみのライブラリなので、それに依存するモジュールを作るのは難しくありません。しかし、私の知る限り、distutils/setuptoolsはバイナリモジュールのビルド前の依存関係をサポートしていないので、Pybind11ヘッダをあなたのディストリビューションに含める方が良いです(それは約12ダースほどではありません)。

ヘッダーファイル(Pybind11を含む)がinclude dirにあり、ソースファイルがsrc dirにあるとします。次に、あなたのsetup.pyファイルには、次のようになります。

import os 
from setuptools import setup 
from setuptools.extension import Extension 

this_dir = os.path.dirname(os.path.abspath(__file__)) 

foo = Extension(
    name='foo', 
    include_dirs=[os.path.join(this_dir, 'include')], 
    sources=[ 
     os.path.join(this_dir, 'src', 'foo.cpp'), 
     os.path.join(this_dir, 'src', 'bar.cpp') 
    ] 
) 

setup(
    name='foo', 
    version='0.0.1', 
    author='John Doe', 
    description='foo module', 
    long_description='blah, blah, blah...', 
    url='http://example.com', 
    classifiers=[ 
     # The list of PyPI classifiers 
    ], 
    ext_modules=[foo], 
    zip_safe=False, 
    include_package_data=True, 
) 

あなたはマクロ定義と、そのようなのような他のパラメータを追加することができます。 あなたMANIFEST.inは次のようになります。

recursive-include src *.cpp 
recursive-include include *.h 

ここで説明するように今、あなたはあなたのパッケージを公開することができますhttps://packaging.python.org私はtwineの使用についての彼らの勧告だけ貧しいHTTPSをサポートして古代のPythonディストリビューションに対して有効であることに注意してくださいすることができます。

pip install fooと入力すると、Pythonバージョンと互換性のあるC/C++コンパイラがインストールされていることを前提としています。これはLinuxでは問題ありません(私はMacについて知りませんが)WindowsではPITAかもしれません。インストールを簡単にするために、上記のパッケージガイドの説明に従って、コンパイル済みのホイールをソースディストリビューションに追加することもできます。 TravisやAppveyor(WindowsベースのCI)のようなCIを使用して、車輪のコンパイルを自動化し、それらをPyPI上に公開することができます。 PyPIにターゲットプラットフォーム用のホイールがある場合、PyPIはユーザーの環境に簡単に展開されます。それ以外の場合、モジュールはソースからコンパイルされます(互換性のあるコンパイラが利用可能であれば、ビルド/インストールは失敗します)。

私はSWIGに慣れていませんが、documentationに記載されているように、コンパイル時にSWIGラッパーをCコードに変換することは、setuptoolsによってネイティブにサポートされています。 SWIGラッパーファイルは、MANIFEST.inによっても含まれています。

バイナリのPythonモジュールが、BoostやOpenSSLなどのいくつかの外部構築済みライブラリに依存する場合は、複雑です。私が言ったように、setuptoolsはビルド前の依存関係をサポートしておらず、Windowsではバイナリライブラリの中心的なレポもありません(Microsoftはvcpkgを作成して状況を修正しようとしています)。この場合、あなたのパッケージにすべてが含まれているか、できるだけ多くのプラットフォームで静的にコンパイルされたホイールを提供するか、あるいは何らかの理由で潜在的なユーザに何らかの前提条件をインストールする必要があることを警告してからpip-バイナリモジュールをインストールしてください。

+0

こんにちは、ローマ、 この素晴らしい答えをありがとう! "distutils/setuptoolsは、バイナリモジュールのビルド前の依存関係をサポートしていません。"これはまさに私が取り組んでいる問題かもしれません。 –

+0

pipはフードの下で 'setuptools'を使い、パッケージソースをダウンロードした後に' python setup.py build install'を実行します(ホイールのプロセスは少し異なります)。純粋なPythonディストリビューションの場合、 'build'は全てを'/build/lib/ 'ディレクトリに単純にコピーすることを意味しますが、バイナリモジュールの場合' build'はコンパイラを使った実際のビルドを意味します。だから 'install_requires ='は 'install'ステップでのみ動作し、私の知る限り、** build **依存関係を指定できる' build_requires'パラメータはありません。 –

+0

実際、私が使っている[setuptools](http://setuptools.readthedocs.io/en/latest/setuptools.html)には* setup_requiresがあります。私は他のプラットフォームで車輪を構築しようとしたときに[このエラー](https://travis-ci.org/fraenkel-lab/pcst_fast/jobs/219742904)を取得していますが、これについてはわかりません。 –

関連する問題