5

Python で使用する既存の C++ ライブラリをラップする必要があります。Python で使用するために C++ をラップする適切な方法の選択に関するこの回答を読んだ後、私は Py++ を使用することにしました。

チュートリアル ファイルを使用して Py++のチュートリアルを実行し、期待される出力を で取得しgenerated.cppましたが、生成されたコードを Python にインポートできる拡張機能として実際に使用するために何をすべきかわかりませんでした。コードをコンパイルしなければならないのは確かですが、何を使って?bjamを使用することになっていますか?

4

3 に答える 3

6

Py++ は、アプリで Python エントリ ポイントを生成するために、boost::python と共に使用する構文を生成します。Py++ ですべてがうまくいったと仮定すると、Boost フレームワークをダウンロードし、boost インクルード ディレクトリと boost::python lib をプロジェクトに追加して、Py++ で生成された cpp でコンパイルする必要があります。

プロジェクトに必要な任意のビルド システムを使用できますが、boost は bjam でビルドされます。静的ライブラリまたは動的ブースト python ライブラリのどちらが必要かを選択する必要があります。次に、こちらのブーストのビルド手順に従ってください。

Windows の場合、ビルドしたライブラリの拡張子を .dll から .pyd に変更する必要があります。はい、ライブラリプロジェクトである必要があります。これは実行可能ファイルでは機能しません。

次に、マシン上の python が見つけられる場所に pyd を配置し、python に移動して import [Your-library-name] を実行すると、うまくいけばすべてが機能します。

最後に、このマクロの generated.cpp で指定された名前:

BOOST_PYTHON_MODULE( -name- )

プロジェクトの正確な名前である必要があります。そうしないと、python が文句を言います。

私はこのすべてを 1 か月も経たないうちに経験したばかりなので、混乱については知っています。

ライブラリのビルドとテスト中に Python 拡張機能を非常に使いやすくするために私が行ったことの 1 つは、自分のビルド環境で boost::python と python をビルドすることでした。そうすれば、pyd は目的の場所に正確に配置され、ユーザーは拡張機能を実行するために python をインストールする必要がなくなります。ただし、それはあなたがしていることにはやり過ぎかもしれません。

編集:拡張機能をマシンに簡単にインストールしてコンパイルしたい場合は、python のsetuptoolsをチェックしてください。ほんの数行の単純な行で、python をコンパイルしてパッケージをインストールすることができます。ただし、1 つの欠点は、ビジュアル スタジオでの開発が好きな私たちにとって IDE と互換性がないことです。

于 2010-01-31T18:01:26.633 に答える
4

次の回答は、Python C++-sig メーリング リストで Roman Yakovenkoから提供されました。スタック オーバーフロー コミュニティのために、少し編集してここに投稿します。

答えはまだ完全には理解できていませんが、正しい方向に向けられていると感じました。


コードを生成したら、それをコンパイルする必要があります。この目的のために、お気に入りのビルド システムを使用できます。私はブーストをコンパイルするためだけに bjam を使用します。この後、scons (Windows および Linux) を使用することを好みます。

以下は、Py++ 単体テストの 1 つをコンパイルするために使用される sconstruct ファイルの例です (これも生成されたコードです :-) ):

import sys
env = Environment()

if 'linux' not in sys.platform:
   env['MSVS'] = {'VERSION': ''}
   env['MSVS_VERSION'] = ''
   Tool('msvc')(env)

t = env.SharedLibrary(
    target=r'abstract_classes',
    source=[r'/home/roman/language-binding/sources/pyplusplus_dev/unittests/temp/abstract_classes.cpp'],
    LIBS=[r"boost_python"],
    LIBPATH=[r"", r"/home/roman/include/libs"],
    CPPPATH=[
        r"/home/roman/boost_svn",
        r"/usr/include/python2.6",
        r"/home/roman/language-binding/sources/pyplusplus_dev/unittests/temp",
        r"/home/roman/language-binding/sources/pyplusplus_dev/unittests/data",
        r"/home/roman/boost_svn"
    ],
    CCFLAGS=[  ],
    SHLIBPREFIX='',
    SHLIBSUFFIX='.so'
)

コード ジェネレーターは Python で記述されているため、Py++ が停止したところから続行して、お気に入りの "make" ファイルを生成できます。お父さんでもいけます。Py++ テストは、コードの生成、コンパイル、新しいモジュールのロード、および機能のテストを行います。これらはすべて、単一のスタンドアロン プロセスで実行されます。

于 2010-02-01T02:55:45.357 に答える
1

次のような小さなメイクファイルを作成しました。

GNUmakefile:

PYTHON_INC=$(shell python-config --includes)
PYTHON_LIBS=$(shell python-config --libs)
BOOST_LIBS=-lboost_python

all:
    g++ -W -Wall $(PYTHON_INC) $(PYTHON_LIBS) $(BOOST_LIBS) -fPIC -shared generated.cpp -o hw.so

次に、作成した .so を ipython にロードして、いじってみました。

In [1]: import hw
In [2]: a = hw.animal('zebra')
In [3]: a.name()
Out[3]: 'zebra'
于 2011-12-30T22:26:06.643 に答える