J'ai un script Python qui doit exécuter un programme externe, mais pour une raison quelconque, il échoue.
Si j'ai le script suivant:
import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();
Ensuite, il échoue avec l'erreur suivante:
'C: \ Temp \ a' n'est pas reconnu comme une commande interne ou externe, un programme exploitable ou un fichier de commandes.
Si j'échappe au programme avec des guillemets:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();
Alors ça marche. Cependant, si j'ajoute un paramètre, il cesse de fonctionner à nouveau:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();
Quelle est la bonne façon d'exécuter un programme et d'attendre qu'il se termine? Je n'ai pas besoin de lire la sortie de celui-ci, car c'est un programme visuel qui fait un travail puis se termine, mais je dois attendre qu'il se termine.
Notez également que déplacer le programme vers un chemin non espacé n'est pas non plus une option.
Cela ne fonctionne pas non plus:
import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();
Notez les guillemets simples / doubles échangés.
Avec ou sans paramètre dans le Bloc-notes ici, il échoue avec le message d'erreur
Le nom de fichier, le nom de répertoire ou la syntaxe d'étiquette de volume est incorrect.
la source
os.system(r'C:\temp\"a b c"\Notepad.exe')
ou ceci:os.system('C:\\temp\\"a b c"\\Notepad.exe')
"C:\Program Files\GDAL\gdal_translate.exe" -ot byte -of GTIFF -scale -co PHOTOMETRIC=CMYK "cmyk-16.tif" "cmyk-8_out.tif"
. En Python, il devient:["C:\\Program Files\\GDAL\\gdal_translate.exe", "-ot", "byte", "-scale", "-co", "PHOTOMETRIC=CMYK", "input_cmyk-16.tif", "output_cmyk-8.tif"]
.Réponses:
subprocess.call
évitera les problèmes liés au traitement des conventions de citation de différents shells. Il accepte une liste, plutôt qu'une chaîne, afin que les arguments soient plus facilement délimités. c'est à direla source
subprocess.call
devrait être remplacé parsubprocess.run
docs.python.org/3/library/subprocess.html#older-high-level-apiVoici une façon différente de procéder.
Si vous utilisez Windows, les actions suivantes consistent à double-cliquer sur le fichier dans l'Explorateur ou à donner le nom du fichier comme argument à la commande DOS "start": le fichier est ouvert avec n'importe quelle application (le cas échéant) à laquelle son extension est associée .
Exemple:
Cela ouvrira textfile.txt avec le bloc-notes si le bloc-notes est associé à des fichiers .txt.
la source
webbrowser.open("textfile.txt")
il devrait ouvrir un éditeur de texte. Voir aussi "démarrer le deuxième programme entièrement seul, comme si je venais de" double-cliquer dessus "."os.startfile('path\to\textfile.txt')
Les guillemets les plus externes sont consommés par Python lui-même, et le shell Windows ne le voit pas. Comme mentionné ci-dessus, Windows ne comprend que les guillemets doubles. Python convertira les barres obliques inversées en barres obliques inverses sous Windows, vous pouvez donc utiliser
Le 'est consommé par Python, qui passe ensuite "C: //Temp/abc/Notepad.exe" (en tant que chemin Windows, aucune double barre oblique inverse nécessaire) à CMD.EXE
la source
os.system('curl URL > file')
où je veux voir l'actualisation du compteur de progression de cURL pour les très gros fichiers.\t
-à- d .\n
, Etc.), cette barre oblique inversée particulière doit être doublée. Être un chemin Windows n'a rien à voir avec cela.os.system()
Windows, la fenêtre cmd s'ouvrira et restera ouverte jusqu'à ce que vous fermiez le processus qu'il a démarré. À mon humble avis, il vaut mieux utiliseros.startfile()
.import os
Au moins dans Windows 7 et Python 3.1,
os.system
dans Windows, la ligne de commande doit être placée entre guillemets s'il y a des espaces dans le chemin d'accès à la commande. Par exemple:Un exemple concret qui m'arrêtait était le clonage d'un lecteur dans VirtualBox. La
subprocess.call
solution ci-dessus n'a pas fonctionné en raison d'un problème de droits d'accès, mais lorsque j'ai double-cité la commande, je suisos.system
devenu heureux:la source
subprocess
, mais parfoisos.system
etos.popen(...).read()
sont juste plus rapides à taper. BTW, vous n'avez pas besoin d'échapper aux guillemets doubles à l'intérieur de single, c'est à dire'""C:\\Temp\\a b c\\Notepad.exe""'
fera l'affaire.la source
Pour python> = 3,5
subprocess.run
doit être utilisé à la place desubprocess.call
https://docs.python.org/3/library/subprocess.html#older-high-level-api
la source
Je suppose que c'est le même problème que lorsque vous utilisez des raccourcis dans Windows ... Essayez ceci:
la source
Supposons que nous voulions exécuter votre serveur Web Django (sous Linux) qu'il y ait de l'espace entre votre chemin (chemin =
'/home/<you>/<first-path-section> <second-path-section>'
), procédez comme suit:[ Remarque ]:
chmod 755 -R <'yor path'>
manage.py
est exceutable:chmod +x manage.py
la source
Pour Python 3.7, utilisez subprocess.call . Utilisez une chaîne brute pour simplifier les chemins Windows:
la source
Pas besoin de sous-processus, il peut être simplement réalisé par
GitPath = "C: \ Program Files \ Git \ git-bash.exe" # Chemin du fichier d'application dans mycase son GITBASH os.startfile (GitPath)
la source