Mam skrypt w języku Python, który musi uruchomić program zewnętrzny, ale z jakiegoś powodu kończy się niepowodzeniem.
Jeśli mam następujący skrypt:
import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();
Następnie kończy się niepowodzeniem z następującym błędem:
„C: \ Temp \ a” nie jest rozpoznawane jako polecenie wewnętrzne lub zewnętrzne, program operacyjny lub plik wsadowy.
Jeśli wyjdę z programu z cytatami:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();
To działa. Jeśli jednak dodam parametr, przestanie on działać:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();
Jaki jest właściwy sposób wykonania programu i oczekiwania na jego zakończenie? Nie muszę czytać z niego danych wyjściowych, ponieważ jest to program wizualny, który wykonuje zadanie, a następnie po prostu wychodzi, ale muszę poczekać, aż się zakończy.
Zauważ też, że przeniesienie programu na ścieżkę nieprzestrzenną również nie jest opcją.
To również nie działa:
import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();
Uwaga zamienione pojedyncze / podwójne cudzysłowy.
Z parametrem Notatnika lub bez niego, komunikat o błędzie nie powiedzie się
Nazwa pliku, nazwa katalogu lub składnia etykiety woluminu jest niepoprawna.
źródło
os.system(r'C:\temp\"a b c"\Notepad.exe')
lub tego: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"
. W Pythonie, staje się:["C:\\Program Files\\GDAL\\gdal_translate.exe", "-ot", "byte", "-scale", "-co", "PHOTOMETRIC=CMYK", "input_cmyk-16.tif", "output_cmyk-8.tif"]
.Odpowiedzi:
subprocess.call
uniknie problemów z radzeniem sobie z konwencjami cytowania różnych powłok. Przyjmuje listę, a nie ciąg znaków, więc argumenty można łatwiej oddzielić. to znaczyźródło
subprocess.call
należy zastąpićsubprocess.run
docs.python.org/3/library/subprocess.html#older-high-level-apiOto inny sposób na zrobienie tego.
Jeśli używasz systemu Windows, poniższe czynności działają jak dwukrotne kliknięcie pliku w Eksploratorze lub podanie nazwy pliku jako argumentu polecenia „start” systemu DOS: plik jest otwierany za pomocą dowolnej aplikacji (jeśli istnieje), z którą jest powiązane rozszerzenie .
Przykład:
Spowoduje to otwarcie pliku tekstowego.txt w Notatniku, jeśli Notatnik jest powiązany z plikami .txt.
źródło
webbrowser.open("textfile.txt")
powinien otworzyć edytor tekstu. Zobacz także: „uruchom drugi program całkowicie samodzielnie, jakbym po prostu„ dwukrotnie go kliknął ”.”os.startfile('path\to\textfile.txt')
Najbardziej zewnętrzne cytaty są pobierane przez sam Python, a powłoka systemu Windows tego nie widzi. Jak wspomniano powyżej, system Windows obsługuje tylko cudzysłowy. Python przekonwertuje ukośniki do tyłu na odwrotne ukośniki w systemie Windows, dzięki czemu możesz używać
Plik „jest konsumowany przez Python, który następnie przekazuje„ C: //Temp/abc/Notepad.exe ”(jako ścieżka systemu Windows, nie wymaga podwójnych ukośników odwrotnych) do CMD.EXE
źródło
os.system('curl URL > file')
którym chcę zobaczyć odświeżanie miernika postępu cURL dla naprawdę dużych plików.\t
,\n
itp), a następnie, że szczególną backslash musi być podwojona. Bycie ścieżką systemu Windows nie ma z tym nic wspólnego.os.system()
w systemie Windows, okno cmd otworzy się i pozostanie otwarte, dopóki nie zamkniesz procesu, który rozpoczął. IMHO lepiej użyćos.startfile()
.import os
Przynajmniej w Windows 7 i Python 3.1,
os.system
w Windows chce podwójnego cudzysłowu, jeśli w ścieżce do polecenia są spacje. Na przykład:Przykładem, który mnie prześladował, było klonowanie dysku w VirtualBox. Powyższe
subprocess.call
rozwiązanie nie zadziałało z powodu pewnych problemów z prawami dostępu, ale kiedy podwoiłem polecenie, byłemos.system
szczęśliwy:źródło
subprocess
, ale czasamios.system
ios.popen(...).read()
są po prostu szybciej pisać. BTW, nie musisz uciekać podwójnych cudzysłowów wewnątrz singla, czyli'""C:\\Temp\\a b c\\Notepad.exe""'
zrobi.źródło
Dla python> = 3.5
subprocess.run
należy użyć zamiastsubprocess.call
https://docs.python.org/3/library/subprocess.html#older-high-level-api
źródło
Podejrzewam, że to ten sam problem, co w przypadku korzystania ze skrótów w systemie Windows ... Wypróbuj to:
źródło
Załóżmy, że chcemy uruchomić serwer WWW Django (w systemie Linux), aby między ścieżką (ścieżka =
'/home/<you>/<first-path-section> <second-path-section>'
) była przestrzeń, więc wykonaj następujące czynności:[ Uwaga ]:
chmod 755 -R <'yor path'>
manage.py
jest możliwe do wykonania:chmod +x manage.py
źródło
W przypadku Python 3.7 użyj subprocess.call . Użyj surowego ciągu znaków, aby uprościć ścieżki systemu Windows:
źródło
Nie ma potrzeby podprocesu, można to po prostu osiągnąć
GitPath = "C: \ Program Files \ Git \ git-bash.exe" # Ścieżka pliku aplikacji mycase jego GITBASH os.startfile (GitPath)
źródło