Wie führe ich ein Programm aus Python? os.system versagt aufgrund Räume in Pfad

StackOverflow https://stackoverflow.com/questions/204017

  •  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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top