Wie führe ich ein Programm aus Python? os.system versagt aufgrund Räume in Pfad
-
03-07-2019 - |
Frage
Ich habe ein Python-Skript, das ein externes Programm ausführen muss, aber aus irgendeinem Grund fehlschlägt.
Wenn ich das folgende Skript:
import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();
Dann schlägt es mit dem folgenden Fehler:
'C: \ Temp \ a'. Ist nicht als interner oder externer Befehl, ein Programm oder Batch-Datei erkannt
Wenn ich entkommen das Programm mit Anführungszeichen:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();
Dann funktioniert es. Wenn ich jedoch einen Parameter hinzufügen, wird er seine Arbeit wieder:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();
Was ist der richtige Weg, ein Programm auszuführen, und zu warten, bis es zu vervollständigen? Ich brauche nicht ausgegeben, es zu lesen, da es ein visuelles Programm, das einen Job macht und dann einfach verlässt, aber ich muss warten, bis es zu beenden.
Beachten Sie auch, um das Programm zu einem Nicht-Abstand Pfad bewegt, ist keine Option.
Das funktioniert nicht, entweder:
import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();
Beachten Sie die getauscht einzelne / doppelte Anführungszeichen.
Mit oder ohne Parameter hier Notizblock, schlägt es mit der Fehlermeldung
Der Dateiname, Verzeichnisname oder Datenträgerbezeichnung ist falsch.
Lösung
subprocess.call
werden Probleme vermeiden, die mit mit mit Zitierkonventionen von verschiedenen Schalen zu beschäftigen. Er akzeptiert eine Liste, sondern als eine Zeichenfolge, so Argumente leichter begrenzt sind. d.
import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])
Andere Tipps
Hier ist eine andere Art und Weise, es zu tun.
Wenn Sie Windows die folgenden Handlungen wie ein Doppelklick auf die Datei im Explorer verwenden, oder geben Sie den Dateinamen als Argument an den DOS-Befehl „Starts“: die Datei mit dem, was Anwendung (falls vorhanden) seiner Verlängerung geöffnet ist im Zusammenhang mit.
filepath = 'textfile.txt'
import os
os.startfile(filepath)
Beispiel:
import os
os.startfile('textfile.txt')
Dies öffnet textfile.txt mit Notepad, wenn Notepad mit TXT-Dateien verknüpft ist.
Die äußersten Zitate werden von Python selbst verbraucht wird, und die Windows-Shell sieht es nicht. Wie oben erwähnt, versteht nur Windows doppelte Anführungszeichen. Python wird auf Schrägstriche auf Windows voraus aufgeschlitzt konvertieren, so können Sie
os.system('"C://Temp/a b c/Notepad.exe"')
Die "von Python verbraucht wird, was passiert dann "C: // Temp / a b c / Notepad.exe"(als Windows-Pfad, keine Doppelschrägstriche erforderlich) zu cmd.exe
Mindestens in Windows 7 und Python 3.1, os.system
in Windows will die Befehlszeile in doppelten Anführungszeichen wenn Leerzeichen in Pfad zu dem Befehl. Zum Beispiel:
TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
os.system(TheCommand)
Ein reales Beispiel, das ich stumping wurde ein Laufwerk in VirtualBox klonen. Die subprocess.call
Lösung oben hat nicht funktioniert, weil einige Zugriffsrechte Problem, aber wenn ich in doppelten Anführungszeichen den Befehl, os.system
wurde glücklich:
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
Ich vermute, es ist das gleiche Problem wie wenn Sie Verknüpfungen in Windows verwenden ... Versuchen Sie folgendes:
import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");
Für Python> = 3.5 subprocess.run
sollte anstelle von subprocess.call
verwendet werden
https://docs.python.org /3/library/subprocess.html#older-high-level-api
import subprocess
subprocess.run(['notepad.exe', 'test.txt'])
Angenommen, wir Ihre Django Web-Server ausgeführt werden soll (in Linux), dass es Raum zwischen Ihrem Pfad (path = '/home/<you>/<first-path-section> <second-path-section>'
), so gehen Sie wie folgt vor:
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_)
[ Hinweis ]:
- Vergessen Sie nicht, den Zugriff auf die Berechtigung:
chmod 755 -R <'yor path'>
-
manage.py
ist exceutable:chmod +x manage.py