2013-03-28 1 views
1

파이썬 하위 프로세스 파괴 외부 bash는 루프와 SSH를 호출입니다 오류없이 출력이 정확합니다. 그러나 이와 같이 호출하면 myscript.sh의 루프가 첫 번째 입력 줄을 통해서만 실행되고 상태 0으로 종료됩니다. subprocess.Popen(...)으로 전화를 교환하면이 호출되지 않고 이후에 Popen.wait()으로 바뀌면 외부 루프가 예상대로 작동하고 ssh 명령의 출력은 bash 스크립트의 출력 이후에 표준 출력으로 덤프됩니다. Popen.wait()의 동작은 check_output과 동일합니다. bash 루프는 오류없이 종료하기 전에 하나의 반복만을 수행합니다.왜 내가 bash는 스크립트 <code>myscript.sh</code>이

ssh 대신에 다른 명령 (예 : lscheck_output으로 호출되면 bash 루프가 예상대로 작동합니다.

표시된 코드가 예상대로 작동하지 않는 이유를 이해할 수있는 사람이 있습니까?

참고 :이 코드로 동일한 동작을 경험할 수 있지만이 코드는 내가 수행하려고 시도하는 단순화 된 버전입니다. 실제로 나는 bash 스크립트에서 "$ line"으로 무엇인가를하고 있고 서브 프로세스 호출은 try/except 블록으로 싸여있다.

+2

추측 :은'ssh' 프로세스가 표준 입력을 먹고있는 ssh 명령에 -n 옵션을 추가하면 문제가 해결. 'stdin = open ("/ dev/null")'을'check_output'으로 전달해보십시오. –

+0

감사합니다. @larsmans 나는 거의 같은 생각을 가지고있었습니다. ssh 명령에 -n 인수를 추가하면 트릭을 수행합니다! – HazyBlueDot

답변

2

마찬가지로 @larsmans는 ssh 호출이 stdin을 소비하면서 외부 bash 루프를 깨뜨린 것으로 추측합니다.

output = subprocess.check_output(['ssh', '-n', '[email protected]', 'cmd'])