情報が見つかりませんでした。 distutuis
とその兄弟setuptools
はExtension
クラスを提供しています。バイナリの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
-バイナリモジュールをインストールしてください。
こんにちは、ローマ、 この素晴らしい答えをありがとう! "distutils/setuptoolsは、バイナリモジュールのビルド前の依存関係をサポートしていません。"これはまさに私が取り組んでいる問題かもしれません。 –
pipはフードの下で 'setuptools'を使い、パッケージソースをダウンロードした後に' python setup.py build install'を実行します(ホイールのプロセスは少し異なります)。純粋なPythonディストリビューションの場合、 'build'は全てを'/build/lib/ 'ディレクトリに単純にコピーすることを意味しますが、バイナリモジュールの場合' build'はコンパイラを使った実際のビルドを意味します。だから 'install_requires ='は 'install'ステップでのみ動作し、私の知る限り、** build **依存関係を指定できる' build_requires'パラメータはありません。 –
実際、私が使っている[setuptools](http://setuptools.readthedocs.io/en/latest/setuptools.html)には* setup_requiresがあります。私は他のプラットフォームで車輪を構築しようとしたときに[このエラー](https://travis-ci.org/fraenkel-lab/pcst_fast/jobs/219742904)を取得していますが、これについてはわかりません。 –