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 147
    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 147
    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 : 50
    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 : 50
    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