나는 많은 셸 함수를 호출하는 python 스크립트가 있습니다. 이 스크립트는 터미널에서 대화식으로 실행될 수 있습니다.이 경우 즉시 출력을 표시하거나 crontab에서 호출합니다. 오류 출력을 이메일로 보내고 싶습니다. 하위 프로세스를 사용하여 셸 출력을 리디렉션
나는 쉘 함수를 호출하기위한 도우미 함수를 썼다 : 이import subprocess
import shlex
import sys
def shell(cmdline, interactive=True):
args = shlex.split(cmdline.encode("ascii"))
proc = subprocess.Popen(args, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
val = proc.communicate()
if interactive is True:
if proc.returncode:
print "returncode " + str(proc.returncode)
print val[1]
sys.exit(1)
else:
print val[0]
else:
if proc.returncode:
print ""
# send email with val[0] + val[1]
if __name__ == "__main__":
# example of command that produces non-zero returncode
shell("ls -z")
난 데 문제는 두 가지입니다.
1) 대화식 모드에서 셸 명령이 끝날 때까지 (예 : 몇 분) 완료 될 때까지는 communications() 버퍼 출력 이후 명령이 완전히 완료 될 때까지 아무것도 표시되지 않습니다. 출력을 표시하고 버퍼링을 피할 수있는 방법이 있습니까? 나는 returncode를 검사 할 방법이 필요하다. 그래서 나는 communications()을 사용하고있다.
2) 내가 호출 한 일부 셸 명령은 많은 양의 출력 (예 : 2MB)을 생성 할 수 있습니다. communications()에 대한 documentation은 "데이터 크기가 크거나 무제한 경우이 방법을 사용하지 마십시오."라고 말합니다. 큰 사람이 얼마나 큰지 아는 사람 있습니까?