Otrzymuję następujący błąd:
WindowsError: [Error 2] The system cannot find the file specified
Mój kod to:
subprocess.call(["<<executable file found in PATH>>"])
Windows 7, 64-bitowy Python 3.x najnowszy, stabilny.
Jakieś pomysły?
Dzięki,
Otrzymuję następujący błąd:
WindowsError: [Error 2] The system cannot find the file specified
Mój kod to:
subprocess.call(["<<executable file found in PATH>>"])
Windows 7, 64-bitowy Python 3.x najnowszy, stabilny.
Jakieś pomysły?
Dzięki,
Odpowiedzi:
Kiedy polecenie jest wbudowaną powłoką, dodaj do wywołania „shell = True”.
Np. Dla dir
ciebie wpiszesz:
import subprocess
subprocess.call('dir', shell=True)
Cytat z dokumentacji:
Jedynym przypadkiem, w którym musisz określić shell = True w systemie Windows, jest sytuacja, gdy polecenie, które chcesz wykonać, jest wbudowane w powłokę (np. Dir lub copy). Nie potrzebujesz powłoki = True do uruchomienia pliku wsadowego lub pliku wykonywalnego opartego na konsoli.
dir.exe
gdy istnieje /bin/ls
in * nix. dir
jest implementowany przez CMD.EXE, podobnie jak cd
przez bash .
PATH
od os.environ
i szukać go ręcznie.
W systemie Windows uważam, że subprocess
moduł nie wygląda, PATH
chyba że zdasz,shell=True
ponieważ używa go CreateProcess()
za kulisami. Jednak shell=True
może to stanowić zagrożenie dla bezpieczeństwa, jeśli przekazujesz argumenty, które mogą pochodzić spoza programu. Aby subprocess
jednak móc znaleźć właściwy plik wykonywalny, możesz użyć shutil.which
. Załóżmy, że plik wykonywalny w twoim PATH
ma nazwę frob
:
subprocess.call([shutil.which('frob'), arg1, arg2])
(Działa to w Pythonie 3.3 i nowszych wersjach).
W systemie Windows musisz zadzwonić przez cmd.exe. Jak wspomniał Apalala, polecenia systemu Windows są zaimplementowane w cmd.exe, a nie jako osobne pliki wykonywalne.
na przykład
subprocess.call(['cmd', '/c', 'dir'])
/ c mówi cmd, aby uruchomić następujące polecenie
Jest to bezpieczniejsze niż użycie shell = True, które umożliwia wstrzykiwanie powłoki.
/k
zamiast /c
. Aby cmd /?
uzyskać szczegółowe informacje, wprowadź w wierszu poleceń.
Po długim drapaniu głowy odkryłem, że uruchomienie pliku znajdującego się w C: \ Windows \ System32 \ podczas uruchamiania 32-bitowej wersji Pythona na komputerze 64-bitowym jest potencjalnym problemem, ponieważ system Windows próbuje przechytrzyć proces, i przekierowuje wywołania do C: \ Windows \ System32 do C: \ Windows \ SysWOW64.
Przykład, jak to naprawić, znalazłem tutaj: http://code.activestate.com/recipes/578035-disable-file-system-redirector/
Cytat z dokumentacji:
„Przed wersją Python 3.5 te trzy funkcje obejmowały wysokopoziomowy interfejs API do podprocesu. Obecnie można używać funkcji run () w wielu przypadkach, ale wiele istniejących kodów wywołuje te funkcje”.
SO: zamiast subprocess.call użyj subprocess.run dla Pythona 3.5 i nowszych
Napotkałem ten sam problem podczas wywoływania PHP. Powodem jest to, że PHP nie jest w PATH, więc polecenie PHP nie zostało znalezione. Ale program PowerShell stwierdził, że istnieje w bieżącej lokalizacji i sugeruje zastąpienie „PHP” przez „. \ PHP”, jeśli ufam temu poleceniu. Wtedy działa dobrze.