L'appel d'un script Python en C++ et utilisant sa sortie
Je veux appeler un script python en C++ et que vous souhaitez utiliser la sortie .fichier csv généré par ce nouveau script en C++. J'ai essayé ceci dans main():
std::string filename = "/home/abc/xyz/script.py";
std::string command = "python ";
command += filename;
system(command.c_str());
Ce n'appeler et exécuter le script python.
La print
commandes dans les Python sont en cours d'exécution. Les choses sont en train d'être imprimé sur l'écran lorsque le script est appelé. So far So good. Cependant, il n'est pas de la création de l' .fichier csv (partie de la même script).
Exemple: j'ai eu un training.csv
fichier avec 100 entrées. J'ai appelé le script Python, avec peu de modifications pour le script, de sorte que le training.csv
fichier maintenant ne devrait contenir que 50 entrées au lieu de 100. Il est remplacé. Toutefois, une telle chose se produise. Reste des commandes dans le script (print
, etc) fonctionnent parfaitement.
La training.csv
fichier doit être lu avec C++ normalement à l'aide de fstream
et getline
.
Aucune idée de comment le faire (à l'aide de Linux)?
Dépend de la plate-forme. Windows et Unix ont des approches différentes. Qui êtes-vous? Et il n'y a rien Python particulière à ce sujet.
Cela devrait vous aider: stackoverflow.com/questions/9405985/...
Aussi, pour la plus courte exemple stackoverflow.com/a/478960/1715716
Si le script python crée un fichier csv. Ensuite, vous n'avez pas besoin de rediriger la sortie des scripts. Il suffit de lancer, et d'ouvrir les fichiers créés à l'aide de la norme api C++.
OriginalL'auteur learner | 2013-06-06
Vous devez vous connecter pour publier un commentaire.
Voici une solution pour intégrer l'exécution de votre module python à partir de votre application C++. Ce n'est pas mieux ou pire que la fourche/de l'exécution de votre script python par le biais d'un appel système, il est juste une manière différente de le faire. S'il est préférable ou non dépend de votre contexte et de l'utilisation.
Il y a quelques temps, j'ai codé une façon de charger les modules python sous la forme de modules d'une application C++, voici la la partie intéressante.
Fondamentalement, vous avez besoin de
#include <Python.h>
, puisPy_Initialize()
pour démarrer votre interpréteur python.Alors vous ne
import sys
, à l'aide de :PyRun_SimpleString("import sys");
, et vous pouvez charger votre plugin en faisantPyRun_SimpleString('sys.path.append("path/to/my/module/")')
.Pour l'échange de valeurs entre C++ et Python, les choses deviennent plus difficiles, vous avez pour transformer tous vos objets en C++ dans des objets python (à partir de la ligne 69 dans mon script).
Ensuite, vous pouvez appeler votre fonction à l'aide de
PyObject_Call_Object(...)
, en utilisant tous les objets python que vous avez créé comme arguments.Vous obtenez la valeur de retour, et transforme toutes ces valeurs dans des objets en C++. Et n'oubliez pas la gestion de la mémoire dans tous qui!
À la fin de votre interpréteur python, un simple appel à
Py_Finalize()
.Il semble vraiment plus difficile qu'elle ne l'est vraiment, mais vous devez être très prudent en faisant cela, car il pourrait conduire à des fuites, des problèmes de sécurité, etc..
OriginalL'auteur zmo
Essayez d'utiliser POSIX est
popen()
au lieu desystem()
. C'tuyaux stdin/stdout de processus enfant est retourné poignée de fichier.fscanf
, je pense 🙂yep, corrigé.
ne l'aide pas 🙁 pourriez-vous s'il vous plaît montrer un échantillon...merci!
OriginalL'auteur Vovanium