2013-10-11 2 views
12

:파이썬 : 인수 (변수) 만 인수로 쉘 스크립트를 실행하는 쉘 스크립트에서 읽을 수있다 내가 파이썬에서 (명령하지) 쉘 스크립트를 실행하려고

main.py 
------- 
from subprocess import Popen 

Process=Popen(['./childdir/execute.sh',str(var1),str(var2)],shell=True) 

execute.sh 
---------- 

echo $1 //does not print anything 
echo $2 //does not print anything 

VAR1 및 VAR2는 일부 문자열입니다 쉘 스크립트의 입력으로 사용하고 있습니다. 나는 뭔가를 놓치고 있습니까? 아니면 그것을 할 수있는 다른 방법이 있습니까?

는 언급 된 How to use subprocess popen Python

답변

12

문제는 shell=True입니다. 다음과 같이 하나, 그 인수를 제거하거나 문자열로 모든 인수를 전달 :

Process=Popen('./childdir/execute.sh %s %s' % (str(var1),str(var2),), shell=True) 

는 인수 자체의 해석처럼 쉘은,이 과정에 Popen의 첫번째 인수에 제공하는 인수를 전달합니다 . 비슷한 질문보기 here. 쉘 스크립트에 아무런 인자도 없으므로 $ 1과 $ 2는 비어 있습니다.

는 popen 그래서 보통 (당신이 그런 >로, 출력 리디렉션 스크립트를 실행하지 않는 한)는 popen에 stdin=stderr= 인수를 제공 할 필요가 없습니다, 파이썬 스크립트의 표준 출력 및 표준 오류를 상속합니다. 파이썬 스크립트 내에서 출력을 읽고 어떻게 든 조작해야하는 경우에만이 작업을 수행해야합니다. 당신이 필요로하는 모든이 (동 기적으로 실행 괜찮다)의 출력을 얻을 수 있습니다 경우 얻을 것이 더 쉽습니다으로

, 나는, check_output을 시도 권하고 싶습니다 출력 Popen 이상 :

output = subprocess.check_output(['./childdir/execute.sh',str(var1),str(var2)]) 
print(output) 

공지 사항이 check_outputcheck_callshell= 인수와 동일한 규칙이 Popen입니다.

+0

예 ... 유용했는데 해결되었습니다. 내 문제. – creativeDrive

+0

@ user2837135 문제가 해결 되었다면이를 수락해야합니다 (체크 표시를 클릭하십시오). 그러면 upvoting도 고려해야합니다. – SethMMorton

+0

이 경우에는'shell = True'를 사용하지 말아야합니다.하지만 사용한다면''shlex.quote()']를 사용하여'var1','var2'를 이스케이프 처리해야합니다 (http : //docs.python. [var1, v2]에있는 v에 대해'output = check_output ("./ childdir/execute.sh"+ "".join (pipes.quote (str (v)) : org/3/library/shlex.html # shlex.quote) var2]), shell = True)' – jfs

3

당신은 실제로 인수를 보내는 ... 쉘 스크립트 대신 당신이 그것을 볼 것이다 인쇄의 파일을 작성합니다. 스크립트에서 인쇄 된 출력을 보려면 통신해야합니다.

from subprocess import Popen,PIPE 

Process=Popen(['./childdir/execute.sh',str(var1),str(var2)],shell=True,stdin=PIPE,stderr=PIPE) 
print Process.communicate() #now you should see your output 
+1

또한 원하는 모든 작업을 수행하려면 출력에 'subprocess.call (['./ childdir/execute.sh ', str (var1), str (var2)], shell = True) . – SethMMorton

+0

@Joran : shell = True로 쉘 스크립트 출력을 볼 수 있었지만 $ 0 ('./ childdir/execute.sh') 즉 실행중인 스크립트를 볼 수 있었지만 인수 var1, var2는 볼 수 없었습니다. – creativeDrive

+0

어쩌면 쉘 스크립트 상단에 shebang을 추가 할 수 있습니다 ... bash에서 실행되지 않을 수도 있습니다. 그러나 인수를 전송할 것이라는 보장이 있습니다. (아마 인자가 아닌 것 같아요) –

관련 문제