Вызов Python script из С++ и использование его вывода - программирование
Подтвердить что ты не робот

Вызов Python script из С++ и использование его вывода

Я хочу вызвать python script из С++ и хочу использовать выходной файл .csv, сгенерированный этим script, обратно в С++. Я пробовал это в main():

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

Это вызов и выполнение python script.

Выполняются команды print в Python. Вещи печатаются на экране при вызове script. Все идет нормально. Однако он не создает файл .csv(часть того же script).

Пример: у меня был файл training.csv с 100 записей. Я назвал Python script с небольшими изменениями в script, так что training.csv файл теперь должен содержать только 50 записей вместо 100. Его перезапись. Однако такого не происходит. Остальные команды в script (print и т.д.) Работают отлично.

Файл training.csv должен читаться на С++, обычно используя fstream и getline.

Любая идея, как это сделать (используя Linux)?

4b9b3361

Ответ 1

Вот решение для внедрения выполнения вашего модуля python из вашего приложения на С++. Это не лучше или хуже, чем форкирование/выполнение вашего python script через системный вызов, это просто другой способ сделать это. Является ли это лучше или не зависит от вашего контекста и использования.

Некоторое время назад я закодировал способ загрузки модулей python в качестве плагинов в приложение С++, здесь интересную часть.

В принципе, вам нужно #include <Python.h>, затем Py_Initialize() запустить ваш интерпретатор python.

Затем вы выполняете import sys, используя: PyRun_SimpleString("import sys");, и вы можете загрузить свой плагин, выполнив PyRun_SimpleString('sys.path.append("path/to/my/module/")').

Для обмена значениями между С++ и Python все становится сложнее, вам нужно преобразовать все объекты С++ в объекты python (стартовая строка 69 в моем script).

Затем вы можете вызвать свою функцию с помощью PyObject_Call_Object(...), используя все объекты python, созданные вами в качестве аргументов.

Вы получаете возвращаемое значение и преобразуете все эти значения в объекты С++. И не забывайте об управлении памятью во всем этом!

Чтобы закончить ваш интерпретатор python, просто вызвать Py_Finalize().

Это действительно выглядит сложнее, чем на самом деле, но вы должны быть очень осторожны, потому что это может привести к утечкам, проблемам безопасности и т.д.

Ответ 2

Попробуйте использовать POSIX popen() вместо system(). Он передает stdin/stdout дочернего процесса в возвращаемый дескриптор файла.

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

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

pclose(in);