2017-01-25 75 views
5

Mam skrypt Pythona, który zawiera wiele poleceń subprocess.call. Napisałem skrypt na Macu i działa idealnie. Po prostu próbowałem uruchomić go w systemie Windows i jestem zaskoczony przez błąd.Dlaczego to polecenie podprogramu w języku Python działa tylko wtedy, gdy shell = True w systemie Windows?

następujące polecenie, aby zadzwonić ImageMagick zwraca "status wyjścia 4":

file1 = "D:/Temp/OCR_test/sample/images/crops/time_0011.png" 
subprocess.call(['convert', file1, '-resize', '200%', file1]) 

Zmiana komendy do następujących prac:

subprocess.call(['convert', file1, '-resize', '200%', file1], shell=True) 

jestem trochę nieufny z powodu korzystania shell=True ostrzeżenia w dokumentacji.
Potrzebuję również polecenia, aby pracować na komputerach Mac i Windows, i jestem zdezorientowany, dlaczego nie działa on w systemie Windows (sprawdziłem i polecenie działa przy użyciu Windows CMD).

ciekawe, następujący wiersz pracował wcześniej w skrypcie (gdzie file, lat_crop1 i croplat są zdefiniowane zmienne):

subprocess.call(['ffmpeg', '-loglevel', 'panic', '-i', file, '-vf', lat_crop1, '-n', croplat]) 

czytam this SO question i próbowałem wszystkie sugestie (shlex, wariacje mojego polecenia, etc ...), ale nadal otrzymuję ten sam wynik.

Ktoś ma pojęcie, jak mogę zmodyfikować tę linię, aby działała bez shell=True?

Co oznacza także "status wyjścia 4"? Szukałem go i czytałem tyle dokumentów, ale nic nie znalazłem.

EDIT: Na podstawie informacji zawartych w odpowiedzi, zmieniłem na komendę, która nie pracowała aby subprocess.call(['mogrify', file1, '-resize', '200%', file1]) i który działa z powodzeniem w Pythonie na Windows. Na szczęście ImageMagick zapewnia mogrify jako alternatywę dla convert.

+0

Co to jest polecenie 'convert'? ImageMagick? – Blorgbeard

+0

Tak, to ImageMagick. Zapomniałem o tym wspomnieć. Działa w linii poleceń. – Bird

+0

możesz wpisać 'where convert' z wiersza poleceń? –

Odpowiedz

6

Podejrzewam, że dzwonisz pod numer C:\Windows\System32\convert.exe (konwerter partycji NTFS/FAT) zamiast imagemagick.

Kiedy shell=True, ścieżka znajdzie skrypt convert.bat lub convert.cmd z ImageMagick, ale bez niego, ścieżka może tylko znaleźć plik .exe, który jest zupełnie inny program, a następnie pojawi się błąd, 4: nieprawidłowy parametr.

W tym szczególnym przypadku nie działa nawet z plikiem wykonywalnym, ponieważ "zły" convert znajduje się w ścieżce systemowej. shell=False tylko przeszukuje ścieżki systemowe (python subprocess Popen environment PATH?). Szkoda, że ​​program o nazwie convert znajduje się w ścieżce systemowej.

Spróbuj jawnie dodać .bat rozszerzenie tak:

subprocess.call(['convert.bat', file1, '-resize', '200%', file1]) 

Aby wiedzieć, które pliki wykonywalne mogą być uruchamiane można wpisać:

where convert 

w wierszu poleceń.

W twoim przypadku (plik wykonywalny), który można obejść, przekazując bezwzględną ścieżkę do pliku wykonywalnego, który chcesz uruchomić.

Innym sposobem byłoby skopiowanie/zmiana nazwy ImageMagick convert na imconvert. Który program nazywa się convert i czy nie spodziewa się konfliktów?

lub w tym przypadku jest to uzasadnione opuścić shell=True, z miłym komentarzem wyjaśniającym, że Microsoft lewo mylące (i rzadko używane convert program w ścieżce systemowej dla nas podróż do)

rozwiązania nie są ładne, przynajmniej są pewne.

+2

['CreateProcess'] (https://msdn.microsoft.com/en-us/library/ms682425) zawsze przeszukuje katalogi systemowe przed' PATH' i próbuje dołączyć ".EXE". Z drugiej strony, powłoka cmd wykonuje własne wyszukiwanie 'PATH' i próbuje dołączyć rozszerzenia do' PATHEXT', a następnie wywołuje 'CreateProcess' z pełną ścieżką znalezionego pliku. – eryksun

+0

@eryksun: znaleziono to: http://stackoverflow.com/questions/5658622/python-subprocess-popen-environment-path. Twoje wyjaśnienie jest najlepsze. Edytuję. –

+0

To naprawdę interesujące i świetnie wiedzieć o innych programach typu "konwertuj". Dodanie pełnej ścieżki w komendzie 'subprocess' zadziałało. Dziękuję za sugestię. Również zmiana modułu ImageMagick na "imconvert" może być dobrym pomysłem. Zgadzam się, że to dziwne, że użyliby tak ogólnej nazwy. – Bird