2013-06-06 25 views
15

C++からPythonスクリプトを呼び出し、このスクリプトで生成された出力.csvファイルをC++に戻したいとします。私はmain()でこれを試しました:C++からPythonスクリプトを呼び出して出力を使用する

std::string filename = "/home/abc/xyz/script.py"; 
std::string command = "python "; 
command += filename; 
system(command.c_str()); 

これはpythonスクリプトを呼び出して実行します。

Pythonのprintコマンドが実行されています。スクリプトが呼び出されると、画面に物が印刷されています。ここまでは順調ですね。ただし、.csvファイル(同じスクリプトの一部)は作成されません。

例:のエントリがtraining.csvのファイルがありました。 training.csvファイルには100個ではなく50個のエントリしか含めることができないように、スクリプトを少し変更してPythonスクリプトを呼び出しました。上書きされます。しかし、そのようなことは起こっていません。スクリプト内の残りのコマンド(printなど)は完全に動作しています。

training.csvファイルは、通常、fstreamgetlineを使用してC++で読み取られます。

どうすればいいですか(Linuxを使用していますか?

+0

OS固有です。あなたはどちらですか? – StoryTeller

+3

シェルを使ってPythonインタプリタの呼び出しを処理する代わりに、Pythonを埋め込む(そして拡張する)方法を調べることができます。 –

+2

プラットフォームによって異なります。 WindowsとUnixには異なるアプローチがあります。あなたはどちらですか?そして、これに関するPython固有のものは何もありません。 – user9876

答えて

12

ここでは、C++アプリケーション内からPythonモジュールの実行を埋め込む方法を示します。 Pythonスクリプトをシステムコールでフォーク/実行するよりも、それほど優れているわけでも、最悪でもありません。それが最良かどうかは、あなたの文脈や使い方に依存します。

私はPythonモジュールをC++アプリケーションのプラグインとして読み込む方法をコーディングしました。ここにはinteresting partがあります。

基本的には、#include <Python.h>、次にPy_Initialize()にする必要があります。

次に、import sysを使用して、PyRun_SimpleString("import sys");を使用して、PyRun_SimpleString('sys.path.append("path/to/my/module/")')を実行してプラグインを読み込むことができます。

C++とPythonの間で値を交換するには、物事がより困難になるため、すべてのC++オブジェクトをPythonオブジェクトに変換する必要があります。

次に、引数として作成したすべてのpythonオブジェクトを使用して、PyObject_Call_Object(...)を使用して関数を呼び出すことができます。

戻り値を取得し、これらの値をすべてC++オブジェクトに変換します。そして、すべてのことでメモリ管理を忘れないでください!

あなたのPythonインタプリタを終了するには、Py_Finalize()という簡単な呼び出しをします。

それは本当にそれが実際よりも難しく見えますが、あなたはそれが漏洩につながる可能性があるため、これをやって本当に注意する必要があり、セキュリティ上の問題など。

+0

ありがとう!!!!しかし、言いたいことは....私はちょっと初心者です.....すべてがとても不気味なものに見えます! :O:O:O – learner

5

はPOSIXのpopen()代わりのsystem()を使用してみてください。子プロセスのstdin/stdoutを返されたファイルハンドルにパイプします。

FILE* in = popen(command.c_str(), "r"); 

fscanf(in, ... // or some other method of reading 

pclose(in); 
+1

あなたは 'fscanf'を意味しています、私は考えます:) – StoryTeller

+0

うん、修正しました。 – Vovanium

+0

@Vovaniumは役に立たない:(サンプルを表示してもらえますか...ありがとう! – learner

関連する問題