2016-07-27 23 views
3

私は完全にboost.pythonを新しくしました。 私はboost.pythonを使ってPythonを適用することを推奨しましたが、それでも理解しやすく解を見つけることはまだありません。私が欲しいものBoost.Pythonによるpythonファイルから関数をインポートする方法

が直接のpythonから関数やクラスをインポートすることで、「SOURCEFILE」

例ファイル: MAIN.CPP MyPythonClass.py

は「犬」がある場合のは言うてみようクラス "myPythonClass.py"で "bark()"関数を使用すると、コールバックを取得してcppで引数を送信するにはどうすればよいですか?

私は何をすべきかわかりません! 私を助けてください!

答えて

5

を1はC++からPythonのを呼び出す必要がある、とC++は、主な機能を所有しているときは、その一つがパイソン埋め込む必要がありますC++プログラム内のインタラプタ。 Boost.Python APIはPython/C APIの包括的なラッパーではないので、Python/C APIの一部を直接呼び出す必要があるかもしれません。それにもかかわらず、Boost.PythonのAPIは相互運用性を向上させます。詳細については、公式のBoost.Python embedding tutorialを読むことを検討してください。ここ


は、Pythonを埋め込むC++プログラムの基本骨格である:パイソンを埋め込む場合

int main() 
{ 
    // Initialize Python. 
    Py_Initialize(); 

    namespace python = boost::python; 
    try 
    { 
    ... Boost.Python calls ... 
    } 
    catch (const python::error_already_set&) 
    { 
    PyErr_Print(); 
    return 1; 
    } 

    // Do not call Py_Finalize() with Boost.Python. 
} 

は、モジュールは、カスタムの場所からインポートすることができるようにPYTHONPATH介しmodule search pathを増強する必要があるかもしれません。

// Allow Python to load modules from the current directory. 
setenv("PYTHONPATH", ".", 1); 
// Initialize Python. 
Py_Initialize(); 

多くの場合、Boost.Python APIはPython-ishの方法でC++コードを書く方法を提供します。

含ま MyPythonClassモジュール考える
#include <boost/python.hpp> 
#include <cstdlib> // setenv 

int main() 
{ 
    // Allow Python to load modules from the current directory. 
    setenv("PYTHONPATH", ".", 1); 
    // Initialize Python. 
    Py_Initialize(); 

    namespace python = boost::python; 
    try 
    { 
    // >>> import MyPythonClass 
    python::object my_python_class_module = python::import("MyPythonClass"); 

    // >>> dog = MyPythonClass.Dog() 
    python::object dog = my_python_class_module.attr("Dog")(); 

    // >>> dog.bark("woof"); 
    dog.attr("bark")("woof"); 
    } 
    catch (const python::error_already_set&) 
    { 
    PyErr_Print(); 
    return 1; 
    } 

    // Do not call Py_Finalize() with Boost.Python. 
} 

:C++でPythonインタプリタを埋め込み、及びCは、ディスクからMyPythonClass PythonモジュールをインポートMyPythonClass.Dogのインスタンスをインスタンス化し、その後Dogインスタンスにbark()を呼び出す++有する次の例demonstrates

class Dog(): 
    def bark(self, message): 
     print "The dog barks: {}".format(message) 

上記プログラム出力:

The dog barks: woof 
+0

Bigありがとうございます。ワーキング!!! –

+0

最後に 'Py_Finalize();'を呼んではいけませんか? –

+0

@TrevorHickey、no。 [Boost.Pythonの埋め込みドキュメント](http://www.boost.org/doc/libs/1_65_1/libs/python/doc/html/tutorial/tutorial/embedding.html)に記載されているように、Py_Finalize()通訳を止めるために呼び出されるべきではありません。 –

0

Boost pythonは、pythonソースからcplusplus関数を呼び出すために使用されます。 Perl xsモジュールによく似ています。

main.cppにbark()という関数がある場合は、boost pythonを使用してこのmain.cppをpython呼び出し可能モジュールに変換できます。 Pythonスクリプトから次に

(main.soリンク出力ファイルをされたと仮定した場合):

import main 
main.bark() 
+0

申し訳ありませんが、私はおそらくいくつかの誤解があります。私はC++環境で働かなければならないので、私のC++プログラムがPythonからDog.bark()を直接使用するようにしたいと考えています.................................................. –

+0

Boost pythonはあなたを助けません。 boostはC++モジュールです。お試しくださいhttps://docs.python.org/3/extending/embedding.html – kbang

関連する問題