2013-07-26 2 views
7

내가 서브 프로세스를 사용하려고 한 복사 작업 (아래 코드)를 수행하기 위해 호출파이썬 하위 프로세스 오류

import subprocess 
pr1 = subprocess.call(['cp','-r','./testdir1/*','./testdir2/'], shell = True) 

을 내가 말하는 오류가 발생했습니다 :

cp: missing file operand 

Try `cp --help' for more information. 

때 나는 내가이 문제를 해결하려면 어떻게합니까

cp: cannot stat `./testdir1/*': No such file or directory 

를 얻을 shell=False으로 시도?

나는 2.6

추신 : 레드햇 리눅스 그놈 Deskop 버전 2.16.0 및 bash 쉘 및 Python을 사용하고 있습니다 , subprocess.call에 문자열이 아닌 목록을 통과 나는 Problems with issuing cp command with Popen in Python에 게시 된 질문을 읽고, 그리고 내가 shell=True를 사용하는 경우 :(

답변

12

을 언급 한 바와 같이 저를 위해 작동하지 않는 shell = True 옵션을 사용하여 제안 :

subprocess.call('cp -r ./testdir1/* ./testdir2/', shell=True) 

The docs say :..

유닉스에서 쉘 = True로,/빈/SH 셸 디폴트 인수는 문자열 인 경우, 문자열이 쉘을 통해 실행할 명령을 지정 이것은 쉘 프롬프트에서 입력 할 때 문자열이 일 때와 똑같은 형식이어야 함을 의미합니다. 예를 들어 공백이있는 파일 이름을 인용하거나 백 슬래시를 이스케이프 처리하는 것을 포함합니다. args가 시퀀스 인 경우 첫 번째 항목은 명령 문자열을 지정하고 추가 항목은 쉘 에 대한 추가 인수로 처리됩니다. 그래서 목록 subprocess.Popen (또는 subprocess.call)에 전달되고, 사용자 (UNIX),리스트의 첫번째 요소는 명령으로 해석

는리스트의 다른 모든 요소는 의 인수로 해석 쉘. 귀하의 경우에는 껍질에 인수를 전달할 필요가 없기 때문에 문자열을 첫 번째 인수로 전달할 수 있습니다.

2

이 글은 현재 오래된 글이지만, 같은 문제가 발생했습니다.

이 호출로 가지고 있었던 문제 :

subprocess.call(['cp','-r','./testdir1/*','./testdir2/'], shell = False) 

은 첫 번째 후 각 매개 변수가 인용하는 것이 었습니다. 쉘이 같은 명령을보고하려면 다음을

cp '-r' './testdir1/*' './testdir2/' 

그 문제는 와일드 카드 문자 (*)입니다. 파일 시스템은 testdir1 디렉토리에 리터럴 이름이 '*'인 파일을 찾습니다. 물론 거기에는 없습니다.

해결 방법은 shell = True 옵션을 사용하고 인용 된 매개 변수를 사용하지 않고 선택된 대답과 같은 방식으로 전화를 거는 것입니다.

+0

좋은 설명. 무슨 일이 일어 났는지 이해할 수있게 도와 줬어. – morganw09dev