2016-10-25 7 views
1

私は問題に直面しています。昨日、PythonでC++の関数をインポートする方法を尋ねるポストを投稿しました。Post。この記事ではBoost Pythonの使用を提案しました。だから私はそれを学び始めた。しかし、すべてのチュートリアルは私のために本当に複雑です。私はPython言語を知っていますが、私はC++を習っていますので、理解が難しいと感じました。もう1つのポイントは、私がここで見つけたすべての記事で、C++の1Dベクトルについて語っていますが、私の関数は2Dベクトルを取ります。std :: vectorsを引数としてC++関数をインポートするBoost Python

実際、すべての投稿では通常、関数ではなくC++クラスが使用されます。そして、私はC++のクラスについて何も知らない。しかし、関数を評価して結果(double)をPythonに返すだけなので、私の場合は役に立たないことがわかりました。だから最初の質問です。 Boost pythonの関数の代わりにクラスを採用する必要がありますか?

あなたが他のポスト私の機能で見ることができるようには、以下の構造を有する:

double many_body_pot(
std::vector< std::vector<double> > &par, 
std::vector< std::vector<double> > &geometry, 
double x, double y, double z) 
{ 
    // ... 
} 

だから、パラメータとして2次元のベクトルと3倍になります。それでは、私が今まで学んできたことは、私は私のC++のスクリプトで#include <boost/python.hpp>を使用する必要があり、私はこのような何かを含める必要がある。

BOOST_PYTHON_MODULE(many_body_pot) { 
    using namespace boost::python; 
    def("many_body_pot", many_body_pot); 
} 

私はPythonではなく、2D ndarraysを送信するために持っているか、2Dは、変換する機能を示しています2Dベクトルに変換する。 2Dのndarraysを使うと、numpyのBoostを使わなくてはなりません。私の場合、私はどちらか一方を使うのは気にしない。しかし、私は2Dベクトルへの変換を行う方法を理解していません。あなたにはわかりやすい解決策を教えてください。本当に感謝しています。

ありがとう

答えて

0

C++には、スクリプト作成しか知らない人にとっては複雑な学習曲線があります。 C++には想像以上に自由度があります。この自由は、新しい学習者の呪いになる可能性があります。だから、C++の仕組みを理解するために時間を割かなければ、間違った作業をするだけでなく、非効率的に行うこともできます。

これはあなたの質問に対する答えではないかもしれませんが、クラスの使用を避けたい場合は、Python's ctypesの使用を検討してください。共有ライブラリを作成し、Pythonでインポートすることができます。

私は、個人的には、あなたがする必要がない限り、不要なライブラリを追加する大きな反対者です。そして、私は​​によって提供される自由と、ほぼすべてのPythonバージョンとの後方互換性と後方互換性、そしてC++の作業をPythonから切り離す可能性は貴重だと思います。したがって、​​の使用を検討してください。次に、関数を作成する方法と、それらを共有ライブラリにコンパイルする方法を学ばなければなりません。また、Pythonのエキスパートであるため、Pythonにそれをインポートして利用する際に問題はありません。

+0

私はctypesの使用を検討しました。しかし、私はそれがCで動作しないことを読んだだけでC + +。私は正しいですよ? –

+0

@KilianArteagaGutierrezいいえ、これはまったく正しくありません。 PythonへのインターフェイスはCです(これが関数なのです)。これは、関数呼び出しがC関数であることを意味しますが、すべての内部メカニズムはCまたはC++、さらにはアセンブリであってもかまいません。あなたのC++プログラムでうまくいくものは何でもあります。私はテンプレートと(Cとは関係のない)すべてを持つ複雑なC++クラスを含めて、実際にはいつもこれを行います。 –

+0

私はあなたの助言に従いました.2DのndarraysをPython-numpy APIを使ってCの関数に渡すことができました。今私は3つの機能を持つ実際のモジュールを構築しようとしています。各関数はAPIのメソッドなので、問題に直面していることを知っています。私は何も返さずに関数の1つを望んでいますが、他のメソッドがアクセスできるものであれば、変数/配列を定義したいと思っています。だから問題は、私が1つのメソッドの中に定義すると、それはアクセス可能になるか、何か特別なことをしなければならないかということです。 –

関連する問題