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

Python Discussion :

probleme subprocess. Popen


Sujet :

Python

  1. #1
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut probleme subprocess. Popen
    Bonjour à tous,

    J'essaye de lancer un subprocess (sous windows)

    Voici le script minimaliste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if __name__ == '__main__':
        print 'this is a script'
    et voici le code qui essaye de le lancer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    import subprocess
    subprocess.Popen(["script.py"],executable="script.py")
    Que je mette l'option executable="script.py" ou non, j'obtiens une erreur:
    WindowsError: [Error 193] %1 n'est pas une application Win32 valide

    cette erreur est issue de
    File "C:\Programs\Python26\lib\subprocess.py", line 844, in _execute_child
    et voici le bloc responsable:
    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
     
    try:
                    hp, ht, pid, tid = CreateProcess(executable, args,
                                             # no special security
                                             None, None,
                                             int(not close_fds),
                                             creationflags,
                                             env,
                                             cwd,
                                             startupinfo)
                except pywintypes.error, e:
                    # Translate pywintypes.error to WindowsError, which is
                    # a subclass of OSError.  FIXME: We should really
                    # translate errno using _sys_errlist (or simliar), but
                    # how can this be done from Python?
                    raise WindowsError(*e.args)
    Comment puis-je faire pour lancer mon script ?

    Merci d'avance

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 698
    Par défaut
    Salut,
    Vous conviendrez qu'un script Python n'est pas un exécutable Windows.
    Pour que çà fonctionne, il faut mettre 'python' devant ou un hint sur la première ligne pour lui dire quel interpreteur lancer, ou crée une association entre *.py et l'interpréteur Python.

    La première solution est 'portable' et si on copie getstatusoutput de command sui est 'obsolete', çà donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from subprocess import *
    def get_status_output(cmd, input=None, cwd=None, env=None):
        pipe =  Popen(
                 cmd, shell=True, cwd=cwd, env=env, stdout=PIPE, stderr=STDOUT
               )
        output, errors = pipe.communicate(input=input)
        assert not errors
        return pipe.returncode, output
     
    if __name__ == '__main__':
        status, output = get_status_output("python foo.py")
        print output
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut
    Salut,

    Merci de me faire remarquer que ce n'est pas un exécutable, j'y avais même pas pensé ;-)

    J'ai testé ta solution, et je reçois l'erreur
    "1 'python' n'est pas reconnu en tant que commande interne
    ou externe, un programme ex‚cutable ou un fichier de commandes"

    Je suis vraiment censé écrire "python" (et non pas son chemin d'accès complet)? Si oui, comment puis-je dire a Windows comment le reconnaitre ?

    Merci d'avance

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 698
    Par défaut
    Ah ben oui...

    Effectivement, pour que "python" ait du sens il faut que Windows trouve python.exe dans PATH et si on l'a pas mis il faut se taper le chemin complet.

    Plus généralement, si vous passez des commandes à subprocess, c'est quand même pour automatiser des traitements qui fonctionnent sous la console Windows...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut Merci
    nt

  6. #6
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 2
    Par défaut AIDE en python
    Salut voila, j'ai un petit souci:

    Je souhaiterais créer un programme python qui lit un fichier video avec VLC.

    Voici mon code:

    p = subprocess.Popen(args=['vlc','test.wav'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)

    L'interface VLC se lance mais le fichier test n'est pas lu...

    Quelqu'un aurait une solution??

    Merci

  7. #7
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 305
    Par défaut
    Salut,

    Juste une idée comme ça, tu as essayé avec le chemin complet du fichier .wav ?

  8. #8
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 2
    Par défaut
    Salut,

    oui j'ai mis le chemin complet, l'interface VLC s'affiche mais le fichier.wav n'est pas lu..

  9. #9
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 305
    Par défaut
    Il semble que 'shell=True' soit en cause.

    Ceci fonctionne très bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    # -*- coding: utf-8 -*-
     
    import sys
    import os
    import subprocess
     
    def read(v):
        cmd = ["vlc", v]
        subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()
     
    if __name__ == "__main__":
        video = "/home/vincent/Arte/Les_cathares.flv"
        read(video)
    Toutefois, la plupart de mes vidéos ont des espaces dans leur nom, ce qui ne gène pas normalement mais ne fonctionne pas dans ce cas ci puisque traités comme autant d"arguments que de mots séparés.

    edit: le .communicate() n'a pas d'usage ici lui non plus, c'était pour vérifier la valeur de retour et éventuellement un message d'erreur.

  10. #10
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Quand j'ai un pb comme ça, j'essaye de faire fonctionner d'abord en console.

    Et, en console, ça, ça marche (=lancement de vlc et début de lecture de la vidéo):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "C:\Program Files (x86)\VideoLAN\VLC\vlc.exe" "D:\Videos\mavideo.mp4"
    Traduction en Python:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    import subprocess
     
    player = r"C:\Program Files (x86)\VideoLAN\VLC\vlc.exe"
    video = r"D:\Videos\mavideo.mp4"
    p = subprocess.Popen(args=[player,video])
    Ce qui donne le même résultat.

    Avec un fichier .wav, c'est pareil.

    Tyrtamos

    Edit: avec ajout des autres arguments, y compris shell=True, le code ci-dessus fonctionne aussi.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. cacher le terminal avec subprocess.popen
    Par bender86 dans le forum Général Python
    Réponses: 1
    Dernier message: 29/08/2011, 18h05
  2. Réponses: 5
    Dernier message: 16/02/2011, 10h23
  3. Aide sur ce probleme de popen
    Par selmani300 dans le forum C++
    Réponses: 3
    Dernier message: 08/06/2009, 15h12
  4. probleme avec popen
    Par Jayhou dans le forum C
    Réponses: 5
    Dernier message: 25/09/2007, 07h39
  5. probleme avec popen
    Par jmathon dans le forum Linux
    Réponses: 5
    Dernier message: 02/05/2007, 10h30

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