[python] Windows가 subprocess.call ()에서 파일을 찾을 수 없습니다.

다음과 같은 오류가 발생합니다.

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가 필요하지 않습니다.


답변

Windows에서는 subprocess모듈이PATHshell=TrueCreateProcess() 뒤에서 사용되기 때문에 통과 하지 않으면 모듈이 보이지 않는다고 생각합니다 . 그러나 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를 사용하는 것보다 안전합니다.


답변

powershell을 사용하는 경우 subprocess.call(['powershell','-command','dir']). Powershell은 POSIX 명령의 많은 부분을 지원합니다.


답변

머리를 많이 긁은 후, 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을 사용하십시오.


답변

PHP를 호출하는 동안 동일한 문제가 발생했습니다. 그 이유는 PHP가 PATH에 없기 때문에 PHP 명령을 찾을 수 없습니다. 그러나 PowerShell은 현재 위치에 존재한다는 것을 발견했으며이 명령을 신뢰하면 ‘PHP’를 ‘. \ PHP’로 대체 할 것을 제안합니다. 그러면 잘 실행됩니다.