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


103

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

WindowsError: [Error 2] The system cannot find the file specified

내 코드는 다음과 같습니다.

subprocess.call(["<<executable file found in PATH>>"])

Windows 7, 64 비트. Python 3.x 최신, 안정.

어떤 아이디어?

감사,


이 실행 파일은 무엇입니까?
SilentGhost 2010 년

Android SDK의 "android"실행 가능 부분
Sri

2
그리고되고 있다 PATH에 사용할 수
스리랑카

명령 줄에서 실행할 수 있습니까?
SilentGhost 2010-06-11

내가 성취하려는 것에 대한 약간의 배경. 이것은 Opendevice 용입니다. HTML5 앱을 기기 별 앱으로 변환하는 오픈 소스 프로젝트입니다. bitbucket.org/srirangan/opendevice/src/tip/tools/net/srirangan/…의 os.system () 을 subprocess.call () 으로 바꾸려고합니다
Sri

답변:


178

명령이 쉘 내장 인 경우 호출에 'shell = True'를 추가하십시오.

예를 들어 dir다음을 입력합니다.

import subprocess
subprocess.call('dir', shell=True)

문서에서 인용하려면 :

Windows에서 shell = True를 지정해야하는 유일한 경우는 실행하려는 명령이 셸에 빌드 된 경우 (예 : dir 또는 copy)입니다. 배치 파일 또는 콘솔 기반 실행 파일을 실행하기 위해 shell = True가 필요하지 않습니다.


14
그것은 * nix에 dir.exe있는 동안 호출 된 실행 파일이 없기 때문 /bin/ls입니다. dir에 의해 구현된다 CMD.EXE 많은 같은 cd의해 구현됩니다 배쉬 .
Apalala 2011 년

1
이것은 강력히 권장하지 않습니다. docs.python.org/2/library/…
nu everest

11
@nueverest 오직 한 때 명령 스트링은 외부 입력으로부터 생성되는
지르

대안 (외부 입력을위한보다 안전한)은을 얻는 것입니다 PATH으로부터 os.environ및 수동으로 검색 할 수 있습니다.
asmeurer jul.

이 문제에 대한 훨씬 더 적절한 솔루션 은 stackoverflow.com/a/32799942/3912576 을 참조하십시오 .
SimonBiggs

33

Windows에서는 subprocess모듈이PATHshell=TrueCreateProcess() 뒤에서 사용되기 때문에 통과 하지 않으면 모듈이 보이지 않는다고 생각합니다 . 그러나 shell=True프로그램 외부에서 올 수있는 인수를 전달하는 경우 보안 위험이 될 수 있습니다. 하려면 subprocess올바른 실행 파일을 찾을 수 그럼에도 불구하고, 당신은 사용할 수 있습니다 shutil.which. 실행 파일의 PATH이름이 frob다음 과 같다고 가정합니다 .

subprocess.call([shutil.which('frob'), arg1, arg2])

(이것은 Python 3.3 이상에서 작동합니다.)


4
파이썬 2 옵션이 있습니까?
Naramsim

1
당신이 옳고 그것을 고칠 올바른 방법을 제안하고 있습니다. 이 대답은 받아 들여 져야합니다. 현재 받아 들여지는 답변은 원인을 설명하지 않으며 경우에 따라 위험 할 수있는 수정을 제안합니다.
David Ferenczy Rogožan

18

Windows에서는 cmd.exe를 통해 호출해야합니다. Apalala가 언급했듯이 Windows 명령은 별도의 실행 파일이 아닌 cmd.exe에서 구현됩니다.

예 :

subprocess.call(['cmd', '/c', 'dir'])

/ c는 cmd에게 다음 명령을 실행하도록 지시합니다.

쉘 주입을 허용하는 shell = True를 사용하는 것보다 안전합니다.


화면을 열어 두려면 어떻게해야합니까?
Moondra

2
내가 제대로 이해하면 @Moondra는 시도 /k대신에 /c. cmd /?자세한 내용은 명령 줄에 입력 하십시오.
User5910 jul.

@ User5910 감사합니다. 기회가되면 한번 시도해 볼게요.
Moondra

3

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


2

머리를 많이 긁은 후, 64 비트 컴퓨터에서 32 비트 버전의 python을 실행하는 동안 C : \ Windows \ System32 \에있는 파일을 실행하는 것이 Windows가 프로세스를 능가하려는 시도로 인해 잠재적 인 문제임을 발견했습니다. C : \ Windows \ System32에 대한 호출을 C : \ Windows \ SysWOW64로 리디렉션합니다.

이 문제를 해결하는 방법의 예는 http://code.activestate.com/recipes/578035-disable-file-system-redirector/입니다.


1

문서에서 인용하려면 :

"Python 3.5 이전에는이 ​​세 가지 함수가 하위 처리를위한 고급 API로 구성되었습니다. 이제 많은 경우에 run ()을 사용할 수 있지만 많은 기존 코드에서 이러한 함수를 호출합니다."

SO : subprocess.call 대신 Python 3.5 이상에서는 subprocess.run을 사용하십시오.


진실하고 도움이됩니다.
Erick G. Hagstrom

0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.