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 dirciebie 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.exegdy istnieje /bin/lsin * nix. dirjest implementowany przez CMD.EXE, podobnie jak cdprzez bash .
PATHod os.environi szukać go ręcznie.
W systemie Windows uważam, że subprocessmoduł nie wygląda, PATHchyba że zdasz,shell=True ponieważ używa go CreateProcess()za kulisami. Jednak shell=Truemoże to stanowić zagrożenie dla bezpieczeństwa, jeśli przekazujesz argumenty, które mogą pochodzić spoza programu. Aby subprocessjednak móc znaleźć właściwy plik wykonywalny, możesz użyć shutil.which. Załóżmy, że plik wykonywalny w twoim PATHma 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.
/kzamiast /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.