web-dev-qa-db-fra.com

Appeler Python à partir de C ++ et utiliser sa sortie

Je veux appeler un script python de C++ et je souhaite utiliser le fichier de sortie .csv généré par ce script en C++. J'ai essayé cela dans main ():

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

Cela appelle et exécute le script python.

Les commandes print dans le Python sont en cours d'exécution. Les choses sont imprimées à l'écran lorsque le script est appelé. Jusqu'ici tout va bien. Cependant, il ne crée pas le. fichier csv (partie du même script).

Exemple: j'avais un training.csv fichier avec 100 entrées. J'ai appelé le script Python, avec peu de changements au script pour que le training.csv fichier devrait maintenant contenir seulement 50 entrées au lieu de 100. Il est écrasé. Cependant, rien de tel ne se passe. Les autres commandes du script (print, etc.) fonctionnent parfaitement.

Le training.csv le fichier doit être lu avec C++ normalement en utilisant fstream et getline.

Une idée de comment le faire (en utilisant Linux)?

22
learner

Voici une solution pour intégrer l'exécution de votre module python à partir de votre application C++. Ce n'est ni mieux ni pire que de forder/exécuter votre script python via un appel système, c'est juste une façon différente de le faire. Que ce soit le meilleur ou non dépend de votre contexte et de votre utilisation.

Il y a quelque temps, j'ai codé un moyen de charger les modules python en tant que plugins pour une application C++, voici le partie intéressante .

Fondamentalement, vous devez #include <Python.h>, Puis Py_Initialize() pour démarrer votre python interprète.

Ensuite, vous faites import sys, En utilisant: PyRun_SimpleString("import sys");, et vous pouvez charger votre plugin en faisant PyRun_SimpleString('sys.path.append("path/to/my/module/")').

Pour échanger des valeurs entre C++ et Python, les choses deviennent plus difficiles, vous devez transformer tous vos objets C++ en python (à partir de la ligne 69 de mon script).

Ensuite, vous pouvez appeler votre fonction en utilisant PyObject_Call_Object(...), en utilisant tous les objets python que vous avez créés comme arguments.

Vous obtenez la valeur de retour et transforme toutes ces valeurs en objets C++. Et n'oubliez pas la gestion de la mémoire dans tout ça!

Pour terminer votre python interprète, un simple appel à Py_Finalize().

Cela semble vraiment plus difficile qu'il ne l'est vraiment, mais vous devez être très prudent en faisant cela, car cela pourrait entraîner des fuites, des problèmes de sécurité, etc.

18
zmo

Essayez d'utiliser popen() au lieu de system(). Il dirige stdin/stdout du processus enfant vers le descripteur de fichier renvoyé.

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

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

pclose(in);
6
Vovanium