Question

J'utilise un IDE brut (Microchip MPLAB) avec C30 toolchain sous Windows XP. Le compilateur C a une sortie très bruyant que je suis incapable de contrôler, et il est très difficile de repérer les avertissements réels et des erreurs dans la fenêtre de sortie.

Je veux écrire un script python qui recevra des arguments pour le compilateur, appelez le compilateur avec les mêmes arguments, les résultats de filtre et les sorties à stdout . Ensuite, je peux remplacer le fichier exécutable du compilateur avec mon script dans les paramètres de l'ensemble des outils. L'IDE appelle mon script et reçoit la sortie du compilateur filtré.

Mon code pour l'exécution du compilateur ressemble à ceci:

arguments = ' '.join(sys.argv[1:])
cmd = '%s %s' % (compiler_path, arguments)
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Le problème est que des citations de arguments sont consommés sur l'exécution du script, donc si IDE appelle mon script avec les arguments suivants:

  

main.c -o "main.o"

la valeur de arguments est

  

main.c -omain.o

La solution la plus évidente est de mettre la liste des arguments tout entre guillemets, mais cela nécessiterait une modification dans le compilateur d'appeler le code dans l'IDE. J'ai aussi essayé d'utiliser le fichier de commandes, mais il ne peut accepter que neuf paramètres (% 1 à 9%), et le compilateur est appelé avec 15+ paramètres.

Est-il possible de transmettre exactement les mêmes arguments à un processus de script?

Était-ce utile?

La solution

Votre coquille est en train de manger les citations (le script python ne les reçoit même) donc je suppose que ce n'est pas très facile de les obtenir « sans modification ».

Autres conseils

Donner les arguments de commande à Popen comme une liste:

arguments = sys.argv[1:]
cmd = [compiler_path] + arguments
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Comme ChristopheD dit le shell supprime les guillemets.

Mais vous n'avez pas besoin de créer vous-même chaîne lorsque vous utilisez Popen: il peut gérer automatiquement pour vous. Vous pouvez le faire à la place:

import sys, subprocess
process = subprocess.Popen(sys.argv[1:], executable=compiler_path, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Le module de sous-processus, espérons passera les arguments correctement pour vous.

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