2012-12-19 5 views
2

파이썬에서 실행중인 Linux 명령이 있습니다.Python에서 명령 출력을받는 방법?

roc = subprocess.Popen(['sshpass', '-p', password, 'rsync', '-avz', '--info=progress2', hostname, '/home/zurelsoft/test'], 
            stderr=subprocess.PIPE, stdout=subprocess.PIPE).communicate()[0] 
print roc 

이렇게하면 명령이 인쇄를 끝내면 인쇄됩니다. 하지만, 나는 명령의 출력을 원한다. 명령이 완전히 실행되면 멈춘다. 어떻게 할 수 있습니까?

답변

3

당신은 Select을 확인하실 수 있습니다 Select Example

Python’s select() 기능은 기본 운영 시스템 구현에 직접 인터페이스입니다. 소켓, 열린 파일 및 파이프 (유효한 파일 설명자를 리턴하는 fileno() 메소드가있는 모든 것)가 읽기 또는 쓰기 가능하게되거나 통신 오류가 발생할 때까지 모니터합니다.

select() 동시에 여러 개의 연결을 모니터링하는 것이 더 쉽고, 소켓 시간 초과를 사용하여 파이썬에서 폴링 루프를 작성하는 것보다 효율적입니다. 모니터링이 인터프리터 대신 운영 체제 네트워크 계층에서 발생하기 때문입니다.

이 당신은 또한

Persistent python subprocess

How can I read all availably data from subprocess.Popen.stdout (non blocking)?

+0

답장을 보내 주셔서 감사합니다. 변수에서 일어나는대로 명령의 출력을 저장하고 json으로 javascript로 보내려고합니다. 하지만 stdin.write()는 터미널 자체에서 출력한다고 가정합니다. 그것을 변수에 저장할 수 있고 자바 스크립트에서 전달할 수 있습니까? 감사합니다 – user1881957

+0

@ user1881957 : 당신은 파일에 그것을 덤프하고 완료 후에 읽을 수 있습니다. 그러나 당신이 변수에 출력을 추가 할 수 없기 때문에 당신이 내 이해에 따라이 우물을 위해 변수를 사용하고자한다면, 당신은 그것을 재 할당 할 수 있습니다. 이것은 원하지 않습니다 (새로운 출력을 할당하고 이전에 저장된 출력을 덮어 씁니다) – avasal

+0

완료 후에 그것을 읽는 것이 아니라 그 데이터를 사용하여 진행 막대를 표시하려고합니다. 진행 상황을 읽는 방법이 필요합니다. – user1881957

0

이것은 당신이 당신이 subprocess.Popen를 통해 그것을 호출하는 경우 명령 줄에서 작동하지만에 파이프를 통과해야 볼 수 있습니다 도움이되지 않는 경우

stdout=sys.stdout 

열려있는 쓰기 가능한 파일 객체에 파이프를 전달하면 출력이 저장됩니다.

out = open("output.tmp","w") 
subprocess.Popen(["ls","-R"],stdout = out) 
out = open("output.tmp","r") 
output = out.readlines() 
관련 문제