34

大規模な C++ 共有ライブラリ (libbig.so) からいくつかの関数を取得し、Cython を介して Python に公開しようとしています。そのために、Cython (pysmall.pyx) 経由で簡単に呼び出せるように、必要な共有ライブラリの機能の薄いラッパーを提供する小さな C++ ファイル (small.cpp) を用意しました。

libbig.so -> small.cpp, small.h -> libsmall.so -> pysmall.pyx -> pysmall.cpp -> pysmall.so

この拡張モジュールを自分のコンピューターでビルドして実行できます。small.cpp を libsmall.so にコンパイルし、setup.py の Extension オブジェクトで "libraries=['small']" と指定して、拡張モジュール pysmall をビルドします。 。それで。

現在、この拡張モジュールを配布しようとしていますが、Cython モジュールと C ソースおよび共有ライブラリを配布するための setup.py のベスト プラクティスを説明するリソースを追跡するのに苦労しています。「 Python モジュールのインストール」、「Python モジュールの配布」、および「Cython モジュールの配布」を読みました。拡張モジュールを単独で配布する方法を理解しています。拡張モジュールの依存関係を配布する最善の方法については、あまり確信が持てません。

Cython のドキュメントには、Cython が存在しない場合に備えて、生成された .cpp ファイルと .pyx ファイルを含める必要があることが示されていますが、それぞれの状況を最適に処理する方法を示すコードは提供されていません。また、Cython モジュールが依存する共有ライブラリを配布する方法についても言及していません。

pandas、lxml、pyzmq、h5py などの setup.py スクリプトを調べているところ、かなりの無関係な作業が発生しています。誰かがこのプロセスを加速するポインタまたはサンプル コードを持っている場合、私はそれを高く評価します!

4

3 に答える 3

17

1) libbig.so の配布

これは、python では解決できない問題です。誰をターゲットにしていますか?Linux の場合、パッケージ マネージャーでインストールするように依頼できますか? libbig がパッケージ マネージャーを介して配布されていないか、Linux ではなく、複数のアーキテクチャをターゲットにしている場合は、libbig ソースを配布する必要がある場合があります。

2) Cython/セットアップツール。

率直に言って、人々が Cython を持っていることを要求するのが最も簡単だと思います。.pyxこのように、コードのグラウンド トゥルース バージョンは 1 つだけであり、とコードの間の矛盾について心配する必要はありません.cpp。これを行う最も簡単な方法は、setuptools代わりに を使用することですdistutils。そうすれば、次を使用できます。

setup('mypackage',
    ...
    install_requires=['cython'])

全体として、setup.pyスクリプトは次のようになります。

# setup.py

from setuptools import setup, Extension
from Cython.Distutils import build_ext

pysmall = Extension('pysmall',
    sources = ['pysmall.pyx', 'small.cpp'],
    include_dirs = ['include/'])

setup(name='mypackage',
      packages=['yourpurepythonpackage'],
      install_requires=['cython==0.17'],
      ext_modules=[pysmall],
      cmdclass = {'build_ext': build_ext})

cython を要求するという考えが気に入らない場合は、次のようにすることができます。

# setup.py

import warnings
try:
    from Cython.Distutils import build_ext
    from setuptools import setup, Extension
    HAVE_CYTHON = True
except ImportError as e:
    HAVE_CYTHON = False
    warnings.warn(e.message)
    from distutils.core import setup, Extension
    from distutils.command import build_ext

pysmall = Extension('pysmall',
    sources = ['pysmall.pyx', 'small.cpp'],
    include_dirs = ['include/'])

configuration = {'name': 'mypackage',
      'packages': ['yourpurepythonpackage'],
      'install_requires': ['cython==0.17'],
      'ext_modules': [pysmall],
      'cmdclass': {'build_ext': build_ext}}

if not HAVE_CYTHON:
    pysmall.sources[0] = 'pysmall.cpp'
    configuration.pop('install_requires')

setup(**configuration)
于 2012-11-28T10:05:59.293 に答える
5

setuptools 18.0 としてリリースされる予定のsetuptools 288の修正をプッシュしました。この変更ログ エントリでは、そのビルドで機能するテクニックについて説明します。テスト用にベータ リリースを利用できます。

于 2015-06-10T16:49:16.860 に答える