Вызов скрипта Python из C ++ и использование его вывода

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

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

Это вызывает и выполняет скрипт Python.

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

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

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

Есть идеи как это сделать (используя Linux)?

 user987606 июн. 2013 г., 14:47
Зависит от платформы. Windows и Unix имеют разные подходы. На чём ты? И там'В этом нет ничего специфического для Python.
 learner06 июн. 2013 г., 14:48
@StoryTeller m работает над Linux
 StoryTeller06 июн. 2013 г., 15:17
Если скрипт Python создает файл CSV. Тогда ты неНе нужно перенаправлять вывод скриптов. Просто запустите его и откройте созданный файл, используя стандартный API C ++.
 StoryTeller06 июн. 2013 г., 14:46
Это'с конкретной ОС. Который ваш?
 learner06 июн. 2013 г., 14:50
@StoryTeller не могли бы вы дать небольшой образец? Я новичок во всем этом ... изучение вещей ... спасибо!
 StoryTeller06 июн. 2013 г., 14:50
Общим подходом будет запуск нового процесса и получение его результатов по каналу.
 StoryTeller06 июн. 2013 г., 16:36
Смотри, очевидно, естьПроблема с вашим скриптом на Python. Задайте об этом отдельный вопрос. Затем вернитесь к открытию файла в C ++.
 StoryTeller06 июн. 2013 г., 14:53
Это должно помочь вам начать:stackoverflow.com/questions/9405985/...
 learner06 июн. 2013 г., 15:13
@ Голгаут вполне понятно ... спасибо !!! но послужит ли это цели здесь? Мой код C ++ должен загрузить CSV-файл, который будет создан скриптом Python .... любая необходимая настройка?
 StoryTeller06 июн. 2013 г., 15:37
Пожалуйста, будьте осторожны. Покажите, как вы пытаетесь открыть файл. И откуда берутся версии?
 learner06 июн. 2013 г., 15:53
@StoryTeller, пожалуйста, проверьте EDIT_2 ... спасибо!
 Christian Kiewiet06 июн. 2013 г., 14:47
Возможно, вы захотите взглянуть на способы встраивания (и расширения) Python вместо того, чтобы иметь дело с вызовами интерпретатора Python через оболочку.
 learner06 июн. 2013 г., 15:05
@StoryTeller это должен быть этот комплекс? Я могу'Постигать такой высокий уровень кодирования! :(
 learner06 июн. 2013 г., 15:20
@StoryTeller это именно то, где я застреваю! Я могу't открыть файл, создаваемый python .... загрузка предыдущих версий файла, а не только что созданного ... как мне это сделать? Спасибо!
 Gauthier Boaglio06 июн. 2013 г., 14:58
Также для более короткого образцаstackoverflow.com/a/478960/1715716

Ответы на вопрос(2)

Вот решение для встраивания исполнения вашего модуля Python из вашего приложения C ++. Это'Не лучше и не хуже, чем разветвление / выполнение скрипта Python с помощью системного вызова, это просто другой способ сделать это. Будет ли это лучше или нет, зависит от вашего контекста и использования.

Некоторое время назад я написал способ загрузки модулей Python в виде плагинов для приложения C ++, здесь 'синтересная часть

В основном вам нужно#include , затем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()

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

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

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

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

pclose(in);
 learner06 июн. 2013 г., 16:07
@ Vovanium не помогает :( не могли бы вы показать образец ... спасибо!

Ваш ответ на вопрос