J'ai un script Python qui doit exécuter un programme externe, mais pour une raison quelconque é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 utilisable 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 ne fonctionne plus:
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 le résultat, car il s'agit d'un programme visuel qui effectue un travail puis se termine, mais je dois attendre qu'il soit terminé.
Notez également que le déplacement du programme vers un chemin non espacé n’est pas une option non plus.
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 à Notepad ici, il échoue avec le message d'erreur
Le nom du fichier, le nom du répertoire ou la syntaxe de l'étiquette du volume est incorrecte.
subprocess.call
évitera les problèmes liés aux conventions de citation de divers obus. Il accepte une liste plutôt qu'une chaîne, de sorte que les arguments sont plus facilement délimités. c'est à dire.
import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])
Voici une façon différente de le faire.
Si vous utilisez Windows, procédez comme suit: double-cliquez sur le fichier dans l'explorateur ou attribuez le nom du fichier à la commande "start" du DOS: le fichier est ouvert avec l'application (le cas échéant) associée à l'extension .
filepath = 'textfile.txt'
import os
os.startfile(filepath)
Exemple:
import os
os.startfile('textfile.txt')
Cela ouvrira textfile.txt avec Notepad si Notepad est associé à des fichiers .txt.
Les citations les plus externes sont utilisées par Python lui-même et Windows Shell ne les voit pas. Comme mentionné ci-dessus, Windows ne comprend que les guillemets doubles. Python convertira les barres obliques inverses sous Windows afin que vous puissiez utiliser
os.system('"C://Temp/a b c/Notepad.exe"')
Le 'est consommé par Python, qui passe ensuite "C: // Temp/a b c/Notepad.exe" (en tant que chemin Windows, aucune double barre oblique inverse n'est nécessaire) à CMD.EXE
Au moins dans Windows 7 et Python 3.1, os.system
dans Windows veut la ligne de commande guillemets doubles s'il existe des espaces dans le chemin d'accès à la commande. Par exemple:
TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
os.system(TheCommand)
Un exemple concret qui me bloquait était le clonage d'un lecteur dans VirtualBox. La solution subprocess.call
ci-dessus n'a pas fonctionné à cause d'un problème de droits d'accès, mais lorsque j'ai double guidé la commande, os.system
est devenu heureux:
TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \
+ ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
os.system(TheCommand)
import win32api # if active state python is installed or install pywin32 package seperately
try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass
Je soupçonne que c'est le même problème que lorsque vous utilisez des raccourcis dans Windows ... Essayez ceci:
import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");
Pour python> = 3.5, subprocess.run
doit être utilisé à la place de subprocess.call
https://docs.python.org/3/library/subprocess.html#older-high-level-api
import subprocess
subprocess.run(['notepad.exe', 'test.txt'])
Supposons que nous voulions utiliser votre serveur Web Django (sous Linux) pour qu'il y ait un espace entre votre chemin (chemin = '/home/<you>/<first-path-section> <second-path-section>'
).
import subprocess
args = ['{}/manage.py'.format('/home/<you>/<first-path-section> <second-path-section>'), 'runserver']
res = subprocess.Popen(args, stdout=subprocess.PIPE)
output, error_ = res.communicate()
if not error_:
print(output)
else:
print(error_)
[ Remarque ]:
chmod 755 -R <'yor path'>
manage.py
est remplaçable: chmod +x manage.py
Pour Python 3.7, utilisez subprocess.call . Utilisez une chaîne brute pour simplifier les chemins Windows:
import subprocess
subprocess.call([r'C:\Temp\Example\Notepad.exe', 'C:\test.txt'])