Question

Je rencontre actuellement un problème majeur avec un script Python. Le script exécute des commandes arbitraires via un gestionnaire pour convertir les rapports d'erreur incorrects en rapports d'erreur corrects.

Le problème que je rencontre est de faire en sorte que le script fonctionne correctement sous Windows avec une commande contenant des esperluettes dans son chemin. J'ai essayé de citer la commande, d'échapper à l'esperluette avec ^ et ni ne fonctionne. Je suis maintenant à court d'idées. Des suggestions?

Pour préciser les réponses actuelles:

  1. J'utilise le module de sous-processus
  2. Je passe la ligne de commande + les arguments sous forme de liste
  3. Le problème concerne le chemin d'accès à la commande elle-même, et aucun des arguments
  4. J'ai essayé de citer la commande. Cela provoque un [Erreur 123]. La syntaxe du nom de fichier, du nom de répertoire ou du libellé de volume est incorrecte error
  5. Je n'utilise aucun argument shell (donc shell = false )
  6. Au cas où cela importerait, j'attrape un tuyau vers stderr pour le traiter, mais en ignorant stdout et stdin
  7. Il ne fonctionne que sous Windows pour le moment et fonctionne comme prévu dans tous les autres cas que j'ai testés jusqu'à présent.
  8. La commande qui échoue est la suivante:
  

p = sous-processus.Popen (prog, stderr = sous-processus.PIPE, bufsize = -1)

lorsque le premier élément de la liste 'prog' contient des esperluettes. La citation de cette première chaîne ne fonctionne pas.

Était-ce utile?

La solution

Assurez-vous que vous utilisez des listes et aucune extension du shell:

subprocess.Popen(['command', 'argument1', 'argument2'], shell=False)

Autres conseils

Une bonne réponse nécessitera plus d'informations que cela. Que faites-vous réellement? Comment ça échoue? Utilisez-vous le module de sous-processus? Passez-vous une liste d'arguments et shell = False (ou pas d'argument shell) ou appelez-vous réellement le shell?

Essayez de citer l'argument contenant le & amp;

wget "http://foo.com/?bar=baz&baz=bar"

Est généralement ce qui doit être fait dans un shell Linux

"échapper à l'esperluette avec ^"

Êtes-vous sûr que ^ est un caractère d'échappement sous Windows? Ne devriez-vous pas utiliser \ ?

Pour répondre à ma propre question:

La commande réelle lors de la transmission des paramètres sous forme de liste ne fonctionne pas correctement (la commande est le premier élément de la liste). Pour résoudre le problème, j'ai transformé la liste en chaîne séparée par des espaces et l'ai passée à un sous-processus.

De meilleures solutions sont toujours les bienvenues.

J'essaie une situation comme suit:

exe = 'C:/Program Files (x86)/VideoLAN/VLC/VLC.exe'
url = 'http://translate.google.com/translate_tts?tl=en&q=hello+world'
subprocess.Popen([exe, url.replace("&","^&")],shell=True)

Cela fonctionne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top