상황 :특정 명령을 실행 한 후 Pexpect가 일시적으로 멈춰있는 이유는 무엇입니까 (EOF가 감지되지 않음)?
나는 그의 작업 명령의 출력을 제공 "라이브"하는 것입니다 pexpect
을 사용하여 작성된 일부 코드를 가지고있다. 나는. 명령이 완료 될 때까지 기다렸다가 출력과 상호 작용하지 않고 명령이 일부 출력을 생성 할 때 또는 곧 출력됩니다.
내가하고있는 일은 서비스를 시작하고 중지하는 것입니다. 이 인쇄 될 때 그래서 같은 과정을 보내고, 다음 각 라인 출력 spawn
하여이를 수행
def watch(process):
output = ""
while True:
try:
line = process.read_nonblocking(timeout = -1)
print(line, end ="")
output += line
except pexpect.EOF:
break
del process
return output
while True:
print("IN 1")
process = pexpect.spawn("service",["zend-server", "stop"], timeout = None)
watch(process)
print("OUT 1")
print("IN 2")
process = pexpect.spawn("service",["zend-server", "start"], timeout = None)
watch(process)
print("OUT 2")
이 코드는 루프 서비스해야의 출력을 인쇄 그것을 시작하고 반복을 중지 시작/멈춤. 출력 결과를 잘 인쇄합니다. 그러나 결국 "OUT 2"직전에 중단됩니다. 출력을 볼 수 있으며 service
호출이 실행을 중지하는 것을 볼 수 있습니다. 그러나 watch
함수는 절대로 EOF를 발생시키지 않고 종료합니다.
이것은 모든 서비스에서 발생하지는 않습니다. 일부 서비스는 무한 루프됩니다. 그러나 다른 관련없는 몇 가지 명령과 함께 zend-server
은 같은 방식으로 간헐적으로 실패합니다.
"결국 멈 춥니 다."라는 말은 서비스가 몇 번 (각 실행마다 변할 수 있음) 시간을 시작/중지하고 중단된다는 의미입니다. 그것은 일반적으로 4-6 후, 첫 번째 호출에 결코 잇몸 - 항상 적어도 두 번째 (따라서 del
성명; 나는 그것을 안전하게 재생 줄 알았어).
파이썬 2.6.6, CentOS는 (64) 6.3, Pexpect 2.3-6, FWIW
질문 :
왜 pexpect
특정 명령에 매달려? 이 문제를 어떻게 해결해야합니까? 이러한 명령 중 일부는 실제로 임의의 시간 동안 실행될 수 있으므로 시간 초과 사용은 실현 가능한 솔루션이 아닙니다. service zend-server stop
은 내가 오래 걸리지 않기 때문에 예제로 골랐다. 끝내는 것을 볼 수있다.
나는 시도했다 :
내가 expect('\n')
를 사용하는 다음, 함께 watch
방법을 교체 시도했지만, 결과는 동일합니다 : 다시 시작의 변수 수 및 다음 최종 요령 .
배열에 expect
과 함께 \n
과 함께 추가 할 수도 있고 루프에서 벗어나는 반환 값을 처리 할 수도 있지만 여전히 같은 위치에 있습니다.
def watch2(process):
output = ""
done = False
while True:
try:
if not process.isalive():
line = process.readline()
done = True
else:
process.expect(['\n'])
line = process.before
print(line)
output += line
if done:
raise pexpect.EOF(0)
except pexpect.EOF:
break
del process
return output
으로 전달하여 버퍼링을 비활성화 할 수 있습니다. 하위 프로세스와 대화를하고 있지 않을 때 왜 'pexpect'를 사용합니까? 출력에만 관심이 있다면 stdlib의'subprocess'만으로도 충분합니다. –
간단한 예입니다. 프로덕션 버전에는'expect '에 대한 호출이 있지만, 필자가 제출 한 예제는 올바르게 작동하지 않습니다. –
이 코드를 사용하여 문제를 복제 할 수 없습니다. 코드가 문제가되는지 잘 모르겠습니다.아마도 젠드 서버에서 출력을 얻지 못했을 것입니다. – aychedee