다음과 같은 오류가 발생합니다.
WindowsError: [Error 2] The system cannot find the file specified
내 코드는 다음과 같습니다.
subprocess.call(["<<executable file found in PATH>>"])
Windows 7, 64 비트. Python 3.x 최신, 안정.
어떤 아이디어?
감사,
다음과 같은 오류가 발생합니다.
WindowsError: [Error 2] The system cannot find the file specified
내 코드는 다음과 같습니다.
subprocess.call(["<<executable file found in PATH>>"])
Windows 7, 64 비트. Python 3.x 최신, 안정.
어떤 아이디어?
감사,
답변:
명령이 쉘 내장 인 경우 호출에 'shell = True'를 추가하십시오.
예를 들어 dir
다음을 입력합니다.
import subprocess
subprocess.call('dir', shell=True)
문서에서 인용하려면 :
Windows에서 shell = True를 지정해야하는 유일한 경우는 실행하려는 명령이 셸에 빌드 된 경우 (예 : dir 또는 copy)입니다. 배치 파일 또는 콘솔 기반 실행 파일을 실행하기 위해 shell = True가 필요하지 않습니다.
dir.exe
있는 동안 호출 된 실행 파일이 없기 때문 /bin/ls
입니다. dir
에 의해 구현된다 CMD.EXE 많은 같은 cd
의해 구현됩니다 배쉬 .
PATH
으로부터 os.environ
및 수동으로 검색 할 수 있습니다.
Windows에서는 subprocess
모듈이PATH
shell=True
CreateProcess()
뒤에서 사용되기 때문에 통과 하지 않으면 모듈이 보이지 않는다고 생각합니다 . 그러나 shell=True
프로그램 외부에서 올 수있는 인수를 전달하는 경우 보안 위험이 될 수 있습니다. 하려면 subprocess
올바른 실행 파일을 찾을 수 그럼에도 불구하고, 당신은 사용할 수 있습니다 shutil.which
. 실행 파일의 PATH
이름이 frob
다음 과 같다고 가정합니다 .
subprocess.call([shutil.which('frob'), arg1, arg2])
(이것은 Python 3.3 이상에서 작동합니다.)
Windows에서는 cmd.exe를 통해 호출해야합니다. Apalala가 언급했듯이 Windows 명령은 별도의 실행 파일이 아닌 cmd.exe에서 구현됩니다.
예 :
subprocess.call(['cmd', '/c', 'dir'])
/ c는 cmd에게 다음 명령을 실행하도록 지시합니다.
쉘 주입을 허용하는 shell = True를 사용하는 것보다 안전합니다.
/k
대신에 /c
. cmd /?
자세한 내용은 명령 줄에 입력 하십시오.
머리를 많이 긁은 후, 64 비트 컴퓨터에서 32 비트 버전의 python을 실행하는 동안 C : \ Windows \ System32 \에있는 파일을 실행하는 것이 Windows가 프로세스를 능가하려는 시도로 인해 잠재적 인 문제임을 발견했습니다. C : \ Windows \ System32에 대한 호출을 C : \ Windows \ SysWOW64로 리디렉션합니다.
이 문제를 해결하는 방법의 예는 http://code.activestate.com/recipes/578035-disable-file-system-redirector/입니다.
문서에서 인용하려면 :
"Python 3.5 이전에는이 세 가지 함수가 하위 처리를위한 고급 API로 구성되었습니다. 이제 많은 경우에 run ()을 사용할 수 있지만 많은 기존 코드에서 이러한 함수를 호출합니다."
SO : subprocess.call 대신 Python 3.5 이상에서는 subprocess.run을 사용하십시오.