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. #21
    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
    Points : 3 156
    Points
    3 156
    Par défaut
    Il faut que tu comprennes ce que tu fais. La communication inter-process, c'est assez comliqué, et ça peut bloquer pour plein de raisons. Poses-toi les bonnes questions:

    • Via quel fichier/pipe/stream est-ce que je communique ?
    • Es-ce que l'écrivain, le lecteur, l'os entre les deux, a un buffer ?
    • Est-ce que je dois réagir dans tous les cas si quelqu'un fonctionne mal (il faut faire de l'asynchrone) ?
    • Est-ce qu'il y aura plusieurs instances lancées en parallèle (attention aux concurrences) ?
    • Mes pipes sont-ils bien du bon type (ex: tu essayes d'utiliser un fichier comme une fifo, pas d'erreurs mais comportement inattendu)
    • etc


    La communication inter-process, c'est compliqué. Voici un petit exemple fonctionnel pour t'aider à te lancer:

    C++

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <fstream>
    #include <thread>
    #include <chrono>
    #include <unistd.h>
     
    using namespace std::literals::chrono_literals;
     
    int main(int argc, char* argv[]) {
        std::ofstream output_stream("myfifo");
        if (output_stream) {
            for (int i = 0; i < 10; ++i) {
                std::this_thread::sleep_for(200ms); // Wait 200ms
                output_stream << i << "\n" << std::flush;
            }
        }
        // else error  : could not open fifo
        return 0;
    }

    Python


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #!/usr/bin/env python
    # -*- encoding:utf-8 -*-
     
    import os, subprocess,stat, sys
     
    # Check we have a fifo
    if os.path.exists("myfifo"):
        if 0 == stat.S_ISFIFO(os.stat("myfifo").st_mode):
            print "Error: not a fifo"
            sys.exit(1)
    else:
        os.mkfifo("myfifo")
     
    # Launch C++
    process = subprocess.Popen(["./main"])
     
    # Print
    with open("myfifo") as fp:
        while True:
            line = fp.readline()
            if line == "": # End of file, C++ is done
                break
            else:
                print(line) # Be careful, "print" adds another "\n"
     
    # Waid end of process
    process.wait()
    A lancer idéalement en mode "unbuffered":

    Find me on github

  2. #22
    Futur Membre du Club
    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
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup !
    j'ai les idées plus clair sur le sujet !
    (et ça marche !)

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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