2017-10-16 1 views
1

Je suis nouveau sur Windows python. J'essaie d'exécuter un outil de ligne de commande en utilisant python. Cet outil fera clignoter le firmware se connectant à l'adresse IP de la machine. Je pourrais ouvrir rapidement cmd et utilisez la commandeExécuter un programme en utilisant python sur Windows

C: \ ToolsSuite> sdi --ip 172.23.240.41 --fwdl « c: \. Builds \ firmware_image.zip .Ce fonctionne pour moi très bien

mais lorsque je tente d'exécuter à l'aide du script python sur les fenêtres, je ne suis pas en mesure de le faire. le script Python ressemble à ceci.

import subprocess 
import os 

os.chdir(r"C:\ToolsSuite") 
#os.system('cd c:\mydir') 
os.system("sdi --ip 192.92.48.32 --fwdl C:\firmware_image.zip") 

#subprocess.Popen(r'sdi --ip 192.92.48.32 --fwdl "c:\firmware_image.zip"', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

l'exception levée est « Impossible de trouver le fichier ». Je ne reçois pas comment pour donner le chemin du fichier de firmware quand il est stocké dans un endroit, disons par exemple le lecteur 'C' ou dans un emplacement de dossier de windows

+0

'os.system (" sdi --ip 192.92.48.32 --fwdl C: \\ firmware_image.zip ")' – Goyo

Répondre

0

Si l'exécutable sdi est dans « C: \ ToolsSuite », cela devrait fonctionner:

subprocess.call(['sdi', '--ip 192.92.48.32', r'--fwdl "c:\firmware_image.zip"']) 
+0

@jonatan, non ce n'est pas le cas. En raison du 'r', tout ce qui réside dans la chaîne suivante entre guillemets simples est considéré comme une chaîne brute sans aucun échappement. Testez-le: 'print r '- fwdl" c: \ firmware_image.zip "'' –

0

Si vous voulez appeler une commande Windows, vous devez donner le chemin complet à la commande.

Vous pouvez essayer:

import subprocess  
import os.path 

# C:\ToolsSuite>sdi --ip 172.23.240.41 --fwdl "c:\BUILDS\firmware_image.zip" 
cmd = os.path.join("C:\\ToolsSuite", "sdi") 
args = [cmd, 
     '--ip', '172.23.240.41', 
     '--fwdl', 'c:\\BUILDS\\firmware_image.zip'] 
subprocess.check_call(args) 

Ici, check_call est utile de remplacer le code de sortie non nul par une exception. Bien sûr, vous pouvez également choisir une autre fonction de la même family.