(Courriels de diversion: <enerve@heriterions-vanter.com> <souillures@empresserai-recueillirent.com> <inspecterent@negocies-lunaire.com> <decuver@fastueux-militaient.com> <resisteras@faconnier-exponentielles.com> <antagoniste@implorerent-consisteriez.com> <admissibilites@commotionne-appuyait.com> <cuisinerez@depreciatifs-totalitaires.com> <deposeras@integrales-hoteliere.com> <equatoriales@insurgeras-parfaire.com> )


Jean-Marc Mongrelet a écrit :

> Bonjour,
>
> J'ai un problème Python à résoudre...
> J'exécute un programme externe à mon script Python, avec la commande
> os.popen, et je souhaiterais que la commande me rende le main avant que
> le programme externe ne soit terminé.
>
> Avec os.popen, je ne sais pas du tout maitriser ça (c'est un coup oui,
> un coup non... je sais pas pourquoi)
> Je teste subprocess.Popen, mais pour le moment, je sèche sur la solution.
> J'ai vu qu'il exister une commande os.wait... j'ai pas trop compris à
> quoi elle sert.
>
> Quelqu'un pourrait-il m'aiguiller pour la maitrise du bloquant/non
> bloquant ?
>
> Merci,
>
> JM
>   
Tel que je le comprends, rien ne garanti que la prochaine instruction
python ne soit exécutée avant que le processus lancé ne soit terminé.

Il me semble que l'exemple suivant (que j'avais écrit en 2008)
correspond au besoin:


        stdoutFile = file(cheminResultats + "/stdout", "w" )
        stderrFile = file(cheminResultats + "/stderr", "w" )

        cmd = ''
        env_val = None
        if os.name == 'nt':
          env_val={"PERL5LIB": str( x ) }
          cmd = str( y + '/bin/perl.exe ' +
                   " " + z + 'file.pl ' +
                   ' '.join ( ('--option1=truc' ,
                                "--option2" ,
                                "--dir=" + cheminResultats
                               ) ) )
        elif os.name == 'posix':
          cmd = str( '/usr/bin/perl' +
                   " " + z + 'file.pl ' +
                   ' '.join ( ('--option1=truc' ,
                                "--option2" ,
                                "--dir=" + cheminResultats
                               ) ) )
          print cmd
        p = subprocess.Popen( cmd , env=env_val, shell=True,
                              stdout=stdoutFile, stderr=stderrFile )
        sts= None

        pid = p.pid
        self.set_last_application_pid( str(pid) )
        self.perlProcess = p
        p.poll()
        startTime = time.time()
        lastTime = startTime
        while p.returncode is None:
          currentTime = time.time()
          if (currentTime - lastTime > 1):
            self.updateTime(currentTime-startTime)
            lastTime = currentTime
          QtGui.qApp.processEvents()
          time.sleep(1)
          p.poll()

        QtGui.qApp.processEvents()
        returncode = p.returncode


En bref:

subprocess.Popen           lance le processus

p.returncode is None         indique que le processus n'est pas terminé

p.poll()                      j'ai oublié, mais cela me semblait
nécessaire: met sans doute à jour p.returncode

p.returncode     contient le code de retour du processus


Les flux stdout et stderr sont redirigés dans des fichiers.

-----------------------------------------------------------------
Les listes de diffusion du CULTe - Pour une informatique libre
http://www.CULTe.org/listes/
Pour se desabonner:
mailto:linux-31-unsubscribe@CULTe.org?subject=Cliquez_sur_ENVOYER