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,
python
path
python-3.x
Sri
źródło
źródło
Odpowiedzi:
Kiedy polecenie jest wbudowaną powłoką, dodaj do wywołania „shell = True”.
Np. Dla
dir
ciebie wpiszesz:Cytat z dokumentacji:
źródło
dir.exe
gdy istnieje/bin/ls
in * nix.dir
jest implementowany przez CMD.EXE, podobnie jakcd
przez bash .PATH
odos.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 goCreateProcess()
za kulisami. Jednakshell=True
może to stanowić zagrożenie dla bezpieczeństwa, jeśli przekazujesz argumenty, które mogą pochodzić spoza programu. Abysubprocess
jednak móc znaleźć właściwy plik wykonywalny, możesz użyćshutil.which
. Załóżmy, że plik wykonywalny w twoimPATH
ma nazwęfrob
:(Działa to w Pythonie 3.3 i nowszych wersjach).
źródło
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
/ 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.
źródło
/k
zamiast/c
. Abycmd /?
uzyskać szczegółowe informacje, wprowadź w wierszu poleceń.Jeśli używasz PowerShell, to będzie
subprocess.call(['powershell','-command','dir'])
. Powershell obsługuje dużą część poleceń POSIXźródło
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/
źródło
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
źródło
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.
źródło