31

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

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

これにより、python スクリプトが呼び出されて実行されます。

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

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

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

それを行う方法(Linuxを使用)はありますか?

4

2 に答える 2

28

これは、C++ アプリケーション内から Python モジュールの実行を埋め込むソリューションです。システムコールを介してPythonスクリプトをフォーク/実行するよりも良くも悪くもありません。それは別の方法です。それが最適かどうかは、コンテキストと使用法によって異なります。

しばらく前に、Python モジュールをプラグインとして C++ アプリケーションにロードする方法をコーディングしました。ここに興味深い部分があります。

#include <Python.h>基本的には、Py_Initialize()Python インタープリターを起動する必要があります。

次にimport sys、: を使用して実行し、実行しPyRun_SimpleString("import sys");てプラグインをロードできますPyRun_SimpleString('sys.path.append("path/to/my/module/")')

C++ と Python の間で値を交換するには、さらに難しくなります。すべての C++ オブジェクトを Python オブジェクトに変換する必要があります (スクリプトの 69 行目から)。

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

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

Python インタープリターを終了するには、Py_Finalize().

実際よりも難しく見えますが、リークやセキュリティの問題などにつながる可能性があるため、これを行うには細心の注意を払う必要があります.

于 2013-06-06T13:18:50.947 に答える
8

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

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

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

pclose(in);
于 2013-06-06T13:37:33.210 に答える