Sous-processus module ne parvient pas à exécuter la commande
Je suis en train d'exécuter Google cpplint.py sur un groupe de mes fichiers et de récupérer les résultats dans un fichier journal. Cependant, je n'ai pas réussi à battre le sous-processus module. Mon code est ici:
import os, subprocess
rootdir = "C:/users/me/Documents/dev/"
srcdir = "project/src/"
with open(rootdir+srcdir+"log.txt", mode='w', encoding='utf-8') as logfile:
for subdir, dirs, files in os.walk(rootdir+srcdir):
for file in files:
if file.endswith(".h") or file.endswith(".cpp"):
filewithpath=os.path.join(subdir, file)
cmd=['c:/Python27/python.exe','C:/users/me/Documents/dev/cpplint.py','--filter=-whitespace,-legal,-build/include,-build/header_guard/', filewithpath]
output = subprocess.check_output(cmd)
logfile.write(output.decode('ascii'))
Essayez d'exécuter le code ci-dessus renvoie une erreur:
File "C:\Python32\lib\site.py", line 159
file=sys.stderr)
^ SyntaxError: invalid syntax Traceback (most recent call last): File "C:\Users\me\Documents\dev\project\src\verifier.py", line 19, in <module>
output = subprocess.check_output(cmd) File "C:\Python32\lib\subprocess.py", line 511, in check_output
raise CalledProcessError(retcode, cmd, output=output) subprocess.CalledProcessError: Command '['c:/Python27/python.exe', 'C:/users/me/Documents/dev/cpplint.py', '--filter=-whitespace,-legal,-build/include,-build/header_guard/', 'C:/users/me/Documents/dev/project/src/aboutdialog.cpp']' returned non-zero exit status 1
Si je remplacer le cmd avec quelque chose de plus simple comme:
cmd=['C:/WinAVR-20100110/bin/avr-gcc.exe','--version']
Ensuite le script fonctionne comme prévu.
J'ai aussi essayé d'utiliser une chaîne de commande unique au lieu d'une liste de chaînes de caractères comme des cmd, mais le résultat est le même.
Lors du débogage du code, j'ai copié la liste-des-cordes-tourner-dans-la-ligne de commande-commande à partir du débogueur et il a couru dans la ligne de commande de Windows, et la commande a fonctionné comme prévu.
L'interpréteur Python exécute mon script Python 3.2.
Des conseils sont grandement appréciés.
Le résultat est le même, si j'utilise le shell=True, shell=False ou de ne pas le définir.
Je me demande si cette façon d'utiliser un Python 2.6 interprète est bon ou pas. À l'aide de
subprocess
est sûr un moyen de sélectionner la version, mais y aurait-il une autre façon d'accéder aux fonctions de ce module Python?La chose intéressante est que la site.py module, que l'original SyntaxError se réfère, traite de l'importation de paquets, ce qui est drôle d'endroit pour une rencontre une erreur de ce genre.
Est l'utilisation de mélanges de versions de python (cmd=['c:/Python27/python.exe' ...) à l'origine du problème? Quand je l'ai couru avec un mannequin cpplint.py (qui se contente d'afficher "bonjour"), il n'a pas obtenir un SyntaxError, il s'est juste arrêté avec "en retour non nul de sortie d'état 2".
OriginalL'auteur Manjabes | 2011-10-25
Vous devez vous connecter pour publier un commentaire.
Ressemble
cpplint.py
est tout simplement sortir avec un non-zéro code de retour - ce qui pourrait faire, par exemple, s'il constate des erreurs ou des "peluches" dans les fichiers de la source de contrôle, il est.Consultez la documentation de sous-processus.check_output. Notez que si la commande exécutée renvoie une code de sortie non nulle puis un
subprocess.CalledProcessError
est soulevée.Qui vous permettrait de travailler autour d'elle en regardant pour
CalledProcessError
, par exempleMODIFIER:
La
SyntaxError
semble être la clé ici, et il est probablement causée parC:\Python32\lib
être dans votre PYTHONPATH (soit explicitement, ou, ce qui pourrait se passer si c'est votre répertoire de travail en cours).L'interpréteur Python (depuis environ 1.5.2-ish) s'exécute automatiquement
import site
lors de son démarrage. Donc, quand c'est le cas, et votre script va s'exécuter:puis le Python 2.7 interprète trouverez
C:\Python32\lib\site.py
première, et d'essayer de chargement qu'au lieu de l'une (probablement) àC:\Python27\lib\site.py
. Le problème est que Python 3site.py
contient une syntaxe incompatible avec Python 2, de sorte que le processus lancé parsubprocess.check_output
est à défaut avec une SyntaxError avant même d'avoir une chance de s'exécutercpplint
, qui se propage leCalledProcessError
.Solution? Assurez-vous que Python2 devient un véritable Python2 "PYTHONPATH", et de même pour Python3! En d'autres termes, assurez-vous que
C:\Python32\lib
n'est pas dans le PYTHONPATH chemin de recherche lors de l'exécution de la Python2 interprète.Une façon de faire dans votre cas est de définir un environnement explicite lors du lancement du processus, par exemple:
le SyntaxError est curieux. Quelque chose à essayer: exécuter
python -c "import site"
(où "python" Python 3.2 exécutable que vous utilisez pour exécuter script, pas cpplint), et voir si vous obtenez une SyntaxError. Si donc, votre installer python3 peut-être manqué quelque sorte?J'ai été en mesure de répéter le SyntaxError par l'exécution de
site.py
de l'Python 3.2.2 libs, mais à l'aide d'un Python 2.x interprète. Donc... je me demande si c'est la racine de vos problèmes? Qu'advient-il si vous exécutez script à l'aide dec:/Python27/python.exe
au lieu de Python3?Aussi: quel est votre répertoire de travail en cours lorsque vous exécutez cette? Si vous êtes dans
C:\Python32\lib
(pour certaines raisons), python27 échoue quand il tente "d'importer" (dont l'interprète n'automatiquement) depuis qu'il trouve unsite.py
dans le WD avant que l'un au niveau du système. Notez queC:\Python32\lib\site.py
utilise la syntaxe n'est pas compatible avec Python2.Oui, c'était ça. J'ai l'habitude d'utiliser le 3.2 interprète comme mon défaut de Python et de l'avoir dans mon CHEMIN (et de ses descendants dans mon PYTHONPATH). Après le réglage, une modification de l'environnement pour le sous-processus, il a travaillé! Si tu pouvais reposter votre commentaire en réponse, je vais l'accepter.
OriginalL'auteur bjlaub
Je voudrais vous demander d'exécuter ce premier
Vous obtiendrez de savoir ce qu'est exactement l'erreur derrière elle, depuis CalledProcessError est déclenché uniquement si le code de sortie non nul.
- vous sûr de vouloir " --filter=-blanc,-juridique,-build/include,-de construire/header_guard/' comme un seul paramètre, ou sont-ils à de multiples paramètres pour le programme
Même si je supprimer le paramètre de filtre au total, le résultat est le même.
'--filter=-blanc','juridique','-build/include','-build/header_guard/' ... de cette façon, tous les paramètres seront considérés comme différents, plutôt que des
Oui, je comprends, mais le script que j'essaie de l'appeler s'attend à le -blanc, juridique etc. dans le cadre de l' --paramètre de filtre. De toute façon, comme je l'ai dit, si je supprime le '--filtre...' complètement de la liste, qui ne veut pas se débarrasser de l'erreur.
OriginalL'auteur avasal
Je l'ai fait par le remplacement de la def main() avec la suivante (je editet la errorfunction trop pour obtenir un bon fichier csv):
OriginalL'auteur Niy