Ich habe ein Python-Skript, das ein externes Programm ausführen muss, aber aus irgendeinem Grund fehlschlägt.
Wenn ich folgendes Skript habe:
import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();
Dann schlägt es mit folgendem Fehler fehl:
'C: \ Temp \ a' wird nicht als interner oder externer Befehl, bedienbares Programm oder Batchdatei erkannt.
Wenn ich dem Programm mit Anführungszeichen entkomme:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();
Dann funktioniert es. Wenn ich jedoch einen Parameter hinzufüge, funktioniert er nicht mehr:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();
Was ist der richtige Weg, um ein Programm auszuführen und auf dessen Abschluss zu warten? Ich muss die Ausgabe nicht lesen, da es sich um ein visuelles Programm handelt, das einen Job erledigt und dann einfach beendet wird, aber ich muss warten, bis es abgeschlossen ist.
Beachten Sie auch, dass das Verschieben des Programms in einen Pfad ohne Abstand ebenfalls keine Option ist.
Dies funktioniert auch nicht:
import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();
Beachten Sie die vertauschten einfachen / doppelten Anführungszeichen.
Mit oder ohne Parameter für Notepad schlägt hier die Fehlermeldung fehl
Die Syntax für Dateiname, Verzeichnisname oder Datenträgerbezeichnung ist falsch.
quelle
os.system(r'C:\temp\"a b c"\Notepad.exe')
oder dies: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"
. In Python wird es :["C:\\Program Files\\GDAL\\gdal_translate.exe", "-ot", "byte", "-scale", "-co", "PHOTOMETRIC=CMYK", "input_cmyk-16.tif", "output_cmyk-8.tif"]
.Antworten:
subprocess.call
vermeidet Probleme mit dem Zitieren von Konventionen verschiedener Schalen. Es akzeptiert eine Liste anstelle einer Zeichenfolge, sodass Argumente leichter abgegrenzt werden können. dhquelle
subprocess.call
sollte durchsubprocess.run
docs.python.org/3/library/subprocess.html#older-high-level-apiHier ist eine andere Art, es zu tun.
Wenn Sie Windows verwenden, können Sie wie folgt im Explorer doppelklicken oder den Dateinamen als Argument für den DOS-Befehl "start" angeben: Die Datei wird mit jeder Anwendung (falls vorhanden) geöffnet, der ihre Erweiterung zugeordnet ist .
Beispiel:
Dadurch wird textfile.txt mit Notepad geöffnet, wenn Notepad mit TXT-Dateien verknüpft ist.
quelle
webbrowser.open("textfile.txt")
Es sollte einen Texteditor öffnen. Siehe auch "Starten Sie das zweite Programm ganz alleine, als hätte ich nur darauf doppelklickt".os.startfile('path\to\textfile.txt')
Die äußersten Anführungszeichen werden von Python selbst verwendet, und die Windows-Shell sieht sie nicht. Wie oben erwähnt, versteht Windows nur doppelte Anführungszeichen. Python konvertiert unter Windows Schrägstriche in Schrägstriche, sodass Sie sie verwenden können
Das 'wird von Python verwendet, das dann "C: //Temp/abc/Notepad.exe" (als Windows-Pfad, keine doppelten Backslashes erforderlich) an CMD.EXE übergibt
quelle
os.system('curl URL > file')
in dem ich die Aktualisierung der Fortschrittsanzeige von cURL für wirklich große Dateien sehen möchte.\t
,\n
usw.) dann , dass bestimmte Backslash muss verdoppelt werden. Ein Windows-Pfad zu sein hat nichts damit zu tun.os.system()
unter Windows das Cmd-Fenster geöffnet bleibt und geöffnet bleibt, bis Sie den gestarteten Prozess schließen. IMHO ist es besser zu verwendenos.startfile()
.import os
Zumindest in Windows 7 und Python 3.1
os.system
möchte Windows, dass die Befehlszeile in doppelte Anführungszeichen gesetzt wird, wenn der Pfad zum Befehl Leerzeichen enthält. Zum Beispiel:Ein reales Beispiel, das mich verblüffte, war das Klonen eines Laufwerks in VirtualBox. Die
subprocess.call
obige Lösung funktionierte aufgrund eines Problems mit Zugriffsrechten nicht, aber als ich den Befehl doppelt zitierte,os.system
wurde ich glücklich:quelle
subprocess
, aber manchmalos.system
undos.popen(...).read()
sind einfach schneller zu tippen. Übrigens müssen Sie sich doppelten Anführungszeichen in einfachen Anführungszeichen nicht entziehen, das heißt'""C:\\Temp\\a b c\\Notepad.exe""'
.quelle
Für Python sollte> = 3.5
subprocess.run
anstelle von verwendet werdensubprocess.call
https://docs.python.org/3/library/subprocess.html#older-high-level-api
quelle
Ich vermute, es ist das gleiche Problem wie bei der Verwendung von Verknüpfungen in Windows ... Versuchen Sie Folgendes:
quelle
Angenommen, wir möchten Ihren Django-Webserver (unter Linux) so ausführen, dass zwischen Ihrem Pfad (path =
'/home/<you>/<first-path-section> <second-path-section>'
) Platz ist. Gehen Sie wie folgt vor:[ Anmerkung ]:
chmod 755 -R <'yor path'>
manage.py
ist exceutable:chmod +x manage.py
quelle
Verwenden Sie für Python 3.7 subprocess.call . Verwenden Sie eine Rohzeichenfolge, um die Windows-Pfade zu vereinfachen:
quelle
Keine Notwendigkeit für Unterprozess, Es kann einfach durch erreicht werden
GitPath = "C: \ Programme \ Git \ git-bash.exe" # Pfad der Anwendungsdatei in mycase seine GITBASH os.startfile (GitPath)
quelle