2013-12-13 4 views
3

내가 이 subprocess.check_call()이 작동하지 않는 이유는 무엇입니까?

import subprocess 
args = ['rsync', '--rsh="ssh"', '/tmp/a/', '127.0.0.1:/tmp/b/'] 
subprocess.check_call(args) 

우분투 (12)

에 파이썬 2.7 이러한 미리보기를 실행하고있어

import subprocess 
args = ['rsync', '--rsh="ssh"', '/tmp/a/', '127.0.0.1:/tmp/b/'] 
call_string = ' '.join(args) 
subprocess.check_call(call_string) 

작품

잘못된 명령 줄을 받고 rsync와의 첫 번째 코드 결과를 실패합니다. 이 옵션의 짧은 버전 (-e)을 사용해도 아무런 차이가 없습니다. --rsh 부분을 제거하면 올바르게 작동합니다.

shell=True을 사용하면 아무런 차이가 없습니다. "ssh"에서 따옴표를 제거해도 아무런 차이가 없으며 따옴표를 유지하여 ssh에 인수를 전달할 수 있습니다.

무엇이 문제입니까?

+0

2 명령이 실패합니다. 그것이 작동한다면'check_call()'(또는 그것이 사용하는 함수)가'shell = True'로 재정의되었습니다. 'shell = False' (기본값)로 첫 번째 명령을 시도하십시오. 'print (inspect.getsource (subprocess.check_call)) '를보십시오 – jfs

+0

BTW, 처음에는이 옵션이 필요합니까? 내'rsync'는 항상 지난 10 년 동안 ots 자신의 ssh를 사용했습니다 ... – glglgl

+0

@glglglg : 결국 rsync가 시작하는 ssh 인스턴스에 몇 가지 인수를 추가하고 싶습니다. – JivanAmara

답변

2

주위 인용 부호를 삭제하십시오 ssh; 쉘은 일반적으로 인용를 빼고 인수 에 사람들을 구문 분석하고 통과 한 것 :

import subprocess 
args = ['rsync', '--rsh=ssh', '/tmp/a/', '127.0.0.1:/tmp/b/'] 
subprocess.check_call(args) 
+0

따옴표를 제거해도 아무런 차이가 없습니다. – JivanAmara

+1

@ JivanAmara : 가치있는 일이라면, 데비안에서 나에게 도움이된다. –

+0

어떤 Python 버전/OS를 사용하고 있습니까? – JivanAmara

관련 문제