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 :

Utiliser commande dos avec python sur un executable dans dossier script


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    GrDF
    Inscrit en
    Novembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : GrDF
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 19
    Par défaut Utiliser commande dos avec python sur un executable dans dossier script
    Bonjour,

    Je me retrouve face à un problème. Je ne suis pas un grand expert de python mais je dois avouer être perdu.
    J'ai fait un petit programme avec PyQt pour compresser des fichier PDF via GhostScript.exe (qui fonctionne normalement en ligne de commande).

    Mon programme permet donc d'ouvrir des fichiers PDF dans un QlistWidget puis en fonction des paramètres choisis (compression) de les compresser grâce à GhostScript.

    Cependant, pour pouvoir diffuser mon programme à mes collègues je souhaitais rajouter un bouton pour récupérer le chemin du GhostScript.exe. (ce qui fonctionne)

    Le problème c'est qu'avec le chemin récupérer je n'arrive pas à faire fonctionner mon script :

    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
       def lanceCompression(self):
            if self.label_2.text() == "GhostScript chargé !":
                optionCompression = self.comboBox.currentText()
                if optionCompression == "Compression maximale":
                    valeurCompression = "screen"
                elif optionCompression == "Compression médium":
                    valeurCompression = "ebook"
                else :
                    valeurCompression = "printer"
                items = []
                for index in xrange(self.listWidget.count()):
                    items.append(self.listWidget.item(index))
     
                for element in items:
                    print(element.text())
                    new_name = element.text()
                    new_name = new_name.replace(".pdf", " [COMPRESSE].pdf")
                    myGhostScript = self.label_3.text()
                    test = ''+myGhostScript + ' -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dPDFSETTINGS=/'+valeurCompression+' -sOUTPUTFILE="'+ new_name +'" -f "'+ element.text()+'"'
                    p = subprocess.Popen(r'start cmd /c ' + test, shell=True)
                    p.wait()
    Dans ce cas de figure la fonction ne se lance pas.

    Par contre mon programme de départ avec un chemin de GhostScript préféfini fonctionne :

    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
       def lanceCompression(self):
                optionCompression = self.comboBox.currentText()
                if optionCompression == "Compression maximale":
                    valeurCompression = "screen"
                elif optionCompression == "Compression médium":
                    valeurCompression = "ebook"
                else :
                    valeurCompression = "printer"
                items = []
                for index in xrange(self.listWidget.count()):
                    items.append(self.listWidget.item(index))
     
                for element in items:
                    print(element.text())
                    new_name = element.text()
                    new_name = new_name.replace(".pdf", " [COMPRESSE].pdf")
                    test = 'C:/Users/nomUtilisateur/Documents/Gratuiciels/Ghostscript/bin/gswin64c.exe -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dPDFSETTINGS=/'+valeurCompression+' -sOUTPUTFILE="'+ new_name +'" -f "'+ element.text()+'"'
                    p = subprocess.Popen(r'start cmd /c ' + test, shell=True)
                    p.wait()
    Est ce que quelqu'un aurait une idée ou une piste pour faire fonctionner mon script ?

    Merci par avance

  2. #2
    Expert confirmé

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

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

    Fais simplement un print(test) avant subprocess pour voir ce que vaut vraiment le chemin de ton programme.

  3. #3
    Membre averti
    Homme Profil pro
    GrDF
    Inscrit en
    Novembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : GrDF
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 19
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Fais simplement un print(test) avant subprocess pour voir ce que vaut vraiment le chemin de ton programme.
    Je l'avais déjà fait avant de poster sur le forum mais ça ne m'a pas aidé. Le chemin renvoyé semble être correct :


    C:/Users/XXXX/Documents/XXXXX/Scripts/Compression PDF/gswin64c.exe -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dPDFSETTINGS=/screen -sOUTPUTFILE="C:\Users\XXXX\Desktop\Fichier\TEST - [COMPRESSE].pdf" -f "C:\Users\XXXX\Desktop\FichierTEST.pdf"
    J'ai tenté plusieurs choses :

    Rajouté les " dans le chemin du .exe => rien ne change
    Rajouté les " dans le chemin du .exe + \ à la place de / => rien ne change

    Si je copie ma ligne cité ci-dessus dans mon cmd.exe ça fonctionne ...

    Je pense que le problème doit provenir de subprocess.Popen !

    J'avais aussi essayé au départ de mettre le ghostscript dans le dossier du script récupérer le path du script pour mettre le chemin du ghostscript automatiquement mais là pareil subprocess ne lançait pas la commande ...

  4. #4
    Membre chevronné
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2012
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2012
    Messages : 321
    Par défaut
    Bonjour,

    Juste une petite remarque, dans la commande popopen, il est spécifié shell= true,

    il me semblait que sous Windows, cet argument n'était utilisé que pour les commandes intégrées au shell (genre copy ou dir). Cette option n'est pas nécessaire pour les exécutables "extérieurs".

    Je ne sais pas si cette modification changerai quelque chose à l’exécution de la commande.

  5. #5
    Membre averti
    Homme Profil pro
    GrDF
    Inscrit en
    Novembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : GrDF
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 19
    Par défaut
    Bonjour,


    Apparemment non , ça ne change rien. J'avais fait le test hier.

    J'ai aussi testé ceci pour voir ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                for element in items:
                    new_name = element.text()
                    new_name = new_name.replace(".pdf", " [COMPRESSE].pdf")
                    myGhostScript = self.label_3.text()
                    myGhostScript = myGhostScript.replace('/', '\\')
                    test = '"'+myGhostScript+'" -q -dSAFER -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dPDFSETTINGS=/'+valeurCompression+' -sOUTPUTFILE="'+ new_name +'" -f "'+ element.text()+'"'
                    print(test)
                    args = shlex.split(test)
                    print(args)
                    p = subprocess.Popen(args)
                    p.wait()
    En testant cette forme là je me rend compte que le print(args) n'est pas utilisé en lançant Python.

    Je pense du coup que le problème vient de plus haut.

  6. #6
    Membre averti
    Homme Profil pro
    GrDF
    Inscrit en
    Novembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : GrDF
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2013
    Messages : 19
    Par défaut
    J'ai trouvé un début d'erreur !

    Le problème vient de l'encodage. Le dossier qui contient le .exe que je vais chercher contient la lettre "ô".

    J'ai donc tout passé en unicode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                    myGhostScript = unicode(myGhostScript.toUtf8(), encoding="UTF-8")
                    new_name = unicode(new_name.toUtf8(), encoding="UTF-8")
                    name = unicode(name.toUtf8(), encoding="UTF-8")
    Le problème est que même en unicode j'ai toujours une erreur du subprocess :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UnicodeEncodeError : 'ascii' codec can't encode character u'\xf4' in position40
    Avec ma variable qui est bien en type unicode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print type(test)
    > <type 'unicode'>
    Quelqu'un a déjà eu ce problème ?

Discussions similaires

  1. Executer commande DOS avec arguments
    Par Zanthia dans le forum C#
    Réponses: 14
    Dernier message: 23/06/2009, 10h58
  2. Utilisation d'Excel avec Python sur un PC n'ayant pas Excel
    Par Dazdh dans le forum Bibliothèques tierces
    Réponses: 4
    Dernier message: 26/01/2009, 11h53
  3. Réponses: 8
    Dernier message: 10/11/2008, 19h40
  4. Réponses: 2
    Dernier message: 13/06/2008, 19h15
  5. [API][Système] Executer une commande dos avec arguments
    Par oOoOuuhmAn dans le forum Général Java
    Réponses: 4
    Dernier message: 17/03/2006, 12h37

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