1

それ自体で機能する C++ で書かれたプログラムがありますが、Python からアクセスできるようにしたいと考えています。具体的には、C++ でより効率的な関数がいくつかありますが、Python スクリプトを使用して、出力に対して他の多くのことを行います。Python で行うには面倒な Boost のルート検索アルゴリズムやその他の機能を使用するため、Python で main() 全体を書き直したくありません。

c++ main() を維持しながら、これらの関数に Python バインディングを追加することは可能ですか? 以前に Python バインディングを行ったことはありませんが、既に Boost を使用しているため、 Boost.pythonを見てきました。ほとんどの例では、c++ 関数/クラスを hpp ファイルで使用し、それらを Python プログラムに埋め込んでいますが、これはまさに私たちが望んでいるものではありません。

私たちが望むのは、C++ プログラムをスタンドアロンとして維持し、ユーザーが必要に応じてそのまま実行できるようにすることと、ユーザーが Python プログラムからこれらの関数を呼び出せるようにすることです。同じ Makefile と exe を使用できるのは素晴らしいことです。バインドされた関数を含む別の C++ ライブラリを実際に作成する必要はありません。これらの便利な関数へのアクセスを許可するだけで、Pythonic バージョンのコードを作成することに関心はありません。

ありがとう

4

1 に答える 1

1

ブースト python で定義したインターフェイスを呼び出す python ラッパー クラスを使用して、python で利用できるようにした広範な c++ ライブラリがあります。

1 つの python クラスは、c++ で書かれた python 拡張モジュールを boost python で呼び出すことにより、pythonic の方法ですべてのクエリを処理します。Python 拡張機能は C++ コードを実行するため、元のライブラリから何でもリンクして使用できます。

ただし、あなたのc ++は実行可能ファイルだと言いました。システム コールを使用してシェル プロセスを起動できないのはなぜですか? これは、Python を含む任意の言語で行うことができます。私が考えたのは、個々の関数にアクセスしたいということです。つまり、すべての関数が静的ライブラリに必要です。

通常どおりに C++ exe をビルドし、共通コードをリンクします。共通コードをリンクする「boost python 拡張モジュール」を作成し、python スクリプトでインポートできるようにします。そしてもちろん、共通コードをリンクしてテストする単体テスト実行可能ファイル。私の好みは、共通コードがスタンドアロンの静的ライブラリであることです (posix gcc ビルドがある場合は -fPic を使用します)。

于 2016-07-27T23:42:32.023 に答える