2008-09-23 3 views
3

J'ai actuellement un problème majeur avec un script python. Le script exécute des commandes arbitraires via un gestionnaire pour convertir les rapports d'erreurs incorrects en rapports d'erreurs corrects.Problème de sous-processus Python avec des esperluettes

Le problème que je rencontre est de faire fonctionner le script correctement sur Windows avec une commande qui contient des esperluettes dans son chemin. J'ai essayé de citer la commande, en échappant à l'esperluette avec^et aucun ne fonctionne. Je suis maintenant à court d'idées. Aucune suggestion?

Pour clarifier des réponses actuelles:

  1. J'utilise le module subprocess
  2. Je passe la ligne de commande + arguments comme une liste
  3. Le problème est avec le chemin de la commande elle-même , pas un des arguments
  4. J'ai essayé de citer la commande. Il provoque une erreur [Error 123] The filename, directory name, or volume label syntax is incorrect
  5. J'utilise aucun argument shell (si shell=false)
  6. Dans le cas où il importe, je suis preneuse une pipe à stderr pour le traitement, mais sans tenir compte stdout et stdin
  7. Il est seulement pour une utilisation sur Windows actuellement, et fonctionne comme prévu dans tous les autres cas que j'ai testés jusqu'à présent.
  8. La commande qui a échoué est:

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

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

+0

Le "script" signifie quoi exactement? Qu'est-ce qui fonctionne sur Windows? Qu'est-ce qui échoue sur un autre OS? Quel autre système d'exploitation? –

Répondre

5

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

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

@ workmad3: par curiosité, quelle partie de cette réponse a aidé? Vous avez déjà donné la syntaxe pour 'Popen' ci-dessus! – katrielalex

1

Une réponse correcte 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 invoquez-vous réellement le shell?

1

Essayez citant l'argument qui contient le &

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

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

0

Pour répondre à ma petite question:

La commande actuelle lors du passage 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 une chaîne séparée par un espace.

De meilleures solutions sont toujours les bienvenues.

+0

Si vous pouvez nous donner quelques * informations réelles * sur ce que vous faites et comment cela échoue, nous pourrions être en mesure de vous donner une solution. Montre-nous ce que tu fais. Montrez-nous le code et l'échec. Ca marche: >>> subprocess.call ([r "c: \ spam & ham \ python.exe", "-c", ""]) >>> –

+0

combien plus d'informations réelles voulez-vous ? J'ai dit quelle est l'erreur, pourquoi cela se produit et j'ai maintenant mis à jour avec la ligne qui échoue pour toute l'aide qu'elle donnera. Il n'y a plus d'informations que je peux donner. – workmad3

+1

Montrez-nous un exemple des chemins d'accès * réels * impliqués, l'erreur * réelle * que vous obtenez, y compris le retraçage, et comment vous l'avez «résolu» dans l'alternative invoquant le shell que vous donnez ici. –

1

« échapper à l'esperluette avec^»

Etes-vous sûr ^ est un caractère d'échappement à Windows? Vous ne devriez pas utiliser \?

+0

Oui^est un caractère d'échappement Windows. \ est le séparateur de répertoire. – workmad3

+0

(clarification,^est un caractère d'échappement de l'interpréteur de commandes Windows) – workmad3

+0

Les arguments de suborocess.Popen() sont des chaînes Python. Etes-vous sûr que le "&" n'a pas été traité ailleurs et transformé en quelque chose d'inattendu. Quelle est la valeur réelle de la variable prog? –

0

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.

Questions connexes