IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

� online � communication entre C++ et Python


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Mai 2016
    Messages
    19
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 19
    Par d�faut � online � communication entre C++ et Python
    Bonjour � tous,

    J'ai un script en C++ qui me permet d'analyser de la vid�o en direct (en � temps r�el � ou � online �) il permet de detecter des �venements dans le flux d'image de la vid�o, j'ai un switch case avec 4 cas. Pour chaque cas je souhaiterais envoyer � quelque chose � vers un script en Python qui tourne en parall�le pour compter chacun de ces �v�nements et r�aliser diff�rentes actions.
    Mon probl�me est donc la communication � online � du C++ vers Python, (j'ai fait quelques essais mais � chaque fois le script Python re�oit les informations une fois que le script en C++ est arr�t� Il faudrait les deux en parall�le�)
    Quelle m�thode puis-je utiliser ?
    Est-il possible d'�crire dans une variable depuis le C++ et la lire depuis Python ?

    Merci beaucoup.
    Dd.

  2. #2
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Salut,

    faut que tu embarques Python dans ton appli.
    C'est pas forc�ment super ais� https://docs.python.org/3/extending/embedding.html
    Y'a aussi Boost.Python en solution alternative, qui sera peut-�tre plus simple � utiliser.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  3. #3
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Mai 2016
    Messages
    19
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 19
    Par d�faut
    Merci de prendre le temps de me r�pondre !
    mon principal probl�me est que je n'ai pas d�velopp� la partie c++ et que l'ensemble est assez complexe... Je ne sais pas bien ou placer le python...
    j'aurai aim� pouvoir simplement r�aliser un envoi depuis de c++.

    � moins que je puisse �crire juste quelque ligne en pythonau niveau de mon switch case en c++ pour envoyer vers un autre script python ??

    Merci

  4. #4
    Membre averti
    Homme Profil pro
    Chomage
    Inscrit en
    Juillet 2016
    Messages
    24
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chomage

    Informations forums :
    Inscription : Juillet 2016
    Messages : 24
    Par d�faut
    Bonjour ^^
    On peut en C++ d�marrer des fichiers comme depuis la ligne de commande avec la commande std::system (c'est une commande pas tres propre qu'on �vite d'utiliser , mais la , je ne vois pas d'alternative) la syntaxe c'est
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
     std::system("C:\\\monchemindacces\\monscript.py")
    ATTENTION : les slash doivent etre pr�c�d�s d'un autre slash pour etre compt� (c'est pour ca qu'il
    y a des Double slash et meme un triple slash) les chemins doivent respecter la maniere d'ecriture de la console de l'OS utilis� (donc pour le projet final v�rifier a coup de #ifdef l'OS avant la commande system est une bonne id�e

  5. #5
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Mai 2016
    Messages
    19
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 19
    Par d�faut
    Excusez moi mais je ne comprend pas bien le principe ...
    car pour moi je voudrais avoir deux scripts qui tournent en parall�le (un C++ et un Python) et que quand arrive certains �venements, le scripte en c++ envois une valeur ou une chaine de caract�re (ou n'importe quoi d'autre), au script python pour qu'il detecte l'�venement.
    Merci !

  6. #6
    Membre tr�s actif
    Homme Profil pro
    D�veloppeur de jeux vid�o
    Inscrit en
    Mai 2014
    Messages
    227
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : D�veloppeur de jeux vid�o
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Par d�faut
    J'avoue que je ne m'y connais pas du tout avec Python mais je comprend ce que tu veux faire. Donc j'ai une soluce ( pas tr�s propre mais bon c'est en attendant ), dans ton switch tu va sauvegarder pour chaque case une donn�e diff�rente dans un fichier. Et quand celui ci est rempli, avec Python tu li et tu efface l'int�rieur apr�s avoir re�u la commande compl�te. Sinon en plus propre tu utilise l'IPC mais bon comme dit je ne connais rien sur python :p

    Edit : en cherchant sur google "IPC C++ Python" t'as pas mal de r�sultat, voici peut �tre une piste �tant donn� que le sujet est r�solue : https://ubuntuforums.org/archive/ind.../t-524072.html

  7. #7
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Mai 2016
    Messages
    19
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 19
    Par d�faut
    Effectivement j'avais pens� � une socket, cependant je ne sais pas comment cr�er un serveur � l'interieur du code c++ d�ja tr�s complexe que je n'ai pas d�velopp� moi-m�me.
    Une solution serait cr�er un serveur qui recevrait les donn�es du programme en c++ pour les passer au script python. Mais toujours le m�me probl�me, je ne sais pas comment envoyer depuis le programme c++ existant...

    sinon je pensais utiliser subprocess et appeler le programme en c++ et r�cuperer les sortie...
    sauf que �a ne marche pas car avec
    out = check_output(["./program.sh"], shell=True)
    il faut attendre la fin de l'execution pour pouvoir recuperer les sorties... je les voudrais au fur et � mesure...

    Merci

  8. #8
    Membre tr�s actif
    Homme Profil pro
    D�veloppeur de jeux vid�o
    Inscrit en
    Mai 2014
    Messages
    227
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : D�veloppeur de jeux vid�o
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Par d�faut
    Sinon pour enregistr� les donn�es en c++ ta un bon vieux syst�me, c'est le ofstream :p

  9. #9
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Il y a globalement 2 s�ries de solutions :
    - Soit tu fais tourner le C++ et le python dans le m�me processus, et tu peux communiquer ce que tu veux entre les deux. Ca suppose que ce soit le C++ qui lance l'interpr�teur python, et il a alors acc�s � son espace m�moire et peut faire ce qu'il veut dedans. Pour �a, je conseille vivement boost.python.
    - Soit tu les fais tourner dans deux processus s�par�s, et dans ce cas l�, il te faut pr�voir un dispositif de communication inter-process. Ca peut �tre un fichier, un mutex/s�maphore nomm�, une socket r�seau, un pipe...
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  10. #10
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Mai 2016
    Messages
    19
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 19
    Par d�faut
    Merci, je pense que faire tourner les deux processus s�parer est meilleur car je n'ai que peu d'info sur comment est construit la partie en c++.
    dans mon cas l'application en c++ a un cout (mais je ne sais pas vraiment o� dans le code) qui me renvoi quelque chose du type "position :" valeur x valeur y
    j'aimerai recup�rer ces valeurs dans mon application python que je suis entrain de cr�er
    Est-ce que dans ce cas je pourrais construire quelques choses du type :
    application en c++ ----> Serveur ou pipe----> application en python ?
    ou ai-je un moyen de "lire" directement depuis python le cout de l'application et s�parer les valeur qui m'int�resse ?

    Merci Beaucoup

    Dd

  11. #11
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Tu dois pouvoir rediriger la sortie standard de ton process C++ pour l'utiliser comme entr�e standard de ton process python. Sous windows, �a s'�crirait comme �a, j'imagine que sous Linux, c'est assez proche :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    c:\MonRep>procCpp | procPython
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  12. #12
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Mai 2016
    Messages
    19
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 19
    Par d�faut
    Merci beaucoup,

    cel� semble est une excellente option, cependant je trouve peu de doc sur le sujet...
    si je comprend bien dans le terminal, je me place dans le repertoire je lance :
    proc"nomdemonexecutable en cpp" | proc"nom de mon executable en python" ?
    puis je lance les deux codes ?
    comment je r�cup�re dans python les donn�es ?
    d�sol�, je d�bute dans ce domaine, et beaucoup de chose ne sont pas encore bien claires pour moi...
    Merci !

    Dd

  13. #13
    Membre Expert
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par d�faut
    Pour de la doc, cherche "bash pipeline" ou regarde directement le manuel de bash. Bash est plut�t pour Linux, mais le fonctionnement est le m�me avec Windows pour ce qui est de la redirection de flux.

    si je comprend bien dans le terminal, je me place dans le repertoire je lance :
    proc"nomdemonexecutable en cpp" | proc"nom de mon executable en python" ?
    Non, "nomdemonexecutable en cpp" | "nom de mon executable en python", �ventuellement "nomdemonexecutable en cpp" | python "nom de mon executable en python" si le script python n'a pas de shebang.

    Le pipe (cf: |) va rediriger la sortie standard du programme de gauche dans l'entr�e standard du programme de droite. En gros, le programme de gauche fait simulateur de frappe clavier. Apr�s, ce n'est que de la lecture/�criture traditionnelle.

  14. #14
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Tu es sur quelle plateforme ?

    Utiliser la sortie standard est une bonne id�e, mais se heurte potentiellement � une collision entre ce qu'il veut faire avec et ce que le programme �crit d�j� sur sa sortie standard. Un truc que j'utilise beaucoup typiquement dans ce genre de situations, ce sont les pipes nomm�s.

    Et aussi, si tu utilises la lib standard pour �crire, attention � la bufferisation, il faut penser � flusher pour que les donn�es soient �crites vers le processus consommateur. Soit std::flush (note: std::endl fait aussi un flush). Sans cela, tu risques d'avoir l'impression que rien n'est �crit alors que c'est juste retard� dans un buffer. Ca peut justement donner l'impression que le python ne re�oit les donn�es qu'une fois le C++ arr�t� : lorsqu'il s'arr�te, le buffer est flush�. Peut-�tre que c'est � l'origine de ton probl�me ?

  15. #15
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Mai 2016
    Messages
    19
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 19
    Par d�faut
    Je suis sur linux ubuntu 14.04
    cela semble fonctionner avec " | " mais effectivement les pipes named semble plus approri�s.
    vaut-il mieux le recr�er � chaque envoi ?
    je n'ai pas trop de d�tail sur le fonctionnement du code en c++... je sais juste o� se trouve la fonction qui est appeler quand l'�v�nement est detect� dans la video.
    Est-ce mettre le mkfifo dans cette fonction pour avoir cr�er le pipe puis envoyer l'info � chaque detection semble appropri� ?
    ou puis-je cr�er le pipe named en bash et simplement prendre la sortie du code c++ pour l'orienter vers mon script python ?

    sinon quand j'utilise :
    ./program.sh | python WCC.py
    cela semble fonctionner ... presque (il semblerai que les probl�mes viennent de la mani�re de r�cup�rer les donn�es en python mais j'y travaille !)

    Grand merci pour vos aides et conseils, j'apprend beaucoup de chose gr�ce � vous !

  16. #16
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Si tu utilises les fifo, tu peux les cr�er pr�alablement avec la commande mkfifo. Ensuite, pas besoin de les r�cr�er � chaque fois, la seule contrainte, c'est que le consommateur python commence � �couter avant que le C++ n'�crive dedans. Ensuite, et bien, �a s'utilise comme un fichier standard, � ceci pr�s que tu ne peux pas seek dedans.

  17. #17
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Mai 2016
    Messages
    19
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 19
    Par d�faut
    Merci beaucoup,
    Encore une question... :
    est-il possible de cr�er un named pipe depuis le bash ? et d'y orienter les sortie du code C++ ?
    comment cela s'�crirait ?

    En fait mon principal probl�me est que si je dois le faire dans le code en c++ je ne sais pas o� ...

    Merci beaucoup !!

  18. #18
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    En shell (bash ou autre), c'est la commande mkfifo.
    Lis en le man, ca devrait t'�clairer.

  19. #19
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Ca d�pend de ton workflow. Dans un script bash, tu peux cr�er la fifo et la d�truire quand tout est termin�, ou bien la cr�er une seule fois et te servir tout le temps de la m�me. Pour y �crire depuis le C++, il faut juste que tu puisses �crire dans un fichier, �a tu devrais y parvenir. Apr�s le point d'entr�e dans ton code, en l'�tat on ne peut pas trop t'aider.

    Le truc c'est que bash n'est pas tr�s pratique pour suivre convenablement l'ex�cution d'un ex�cutable tiers. A ta place, je ferais tout en python, y compris le lancement de l'ex�cutable C++. Tu peux utiliser subprocess pour la gestion de l'ex�cutable et tu peux m�me cr�er la fifo en python directement avec os.mkfifo.

  20. #20
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Mai 2016
    Messages
    19
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 19
    Par d�faut
    Merci,
    J'ai tent� d'utiliser subprocess mais le probl�me est de r�cup�rer les sortie du code c++ au fur et � mesure.
    avec :
    Code C++ : S�lectionner tout - Visualiser dans une fen�tre � part
    out = check_output(["./program.sh"], shell=True)

    il faut attendre la fin de l'ex�cution pour pouvoir r�cup�rer les sorties. Je les voudrais au fur et � mesure�
    Vraiment comme si le deux processus fonctionnent en parall�le.

    Existe-t-il une autre m�thode avec subprocess qui permet de faire �a ? je n'ai pas trouv� facilement d'exemple de �a exactement...

    Merci !

+ R�pondre � la discussion
Cette discussion est r�solue.
Page 1 sur 2 12 Derni�reDerni�re

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo