대화식 하위 프로세스 통신을 작성하는 방법을 배우려고합니다.python 대화 형 하위 프로세스 통신
내가 아래에있는 내 코드는,에서 표준 출력을 읽고 표준 입력 지속적으로 작성해야합니다, 그것은 일종의 "작동"그러나 나는 그것을 내가 가진 가정 (아주 해킹 코드입니다)
작성하고있는 중이 야 확실하지 않다 위의 스크립트 (app.py)와 상호 작용에
import logging
import random
def app():
number1 = random.randint(1,100)
number2 = random.randint(200,500)
logging.info("number1: %s, number2: %s", number1, number2)
ans = input("enter sum of {} and {}: ".format(number1, number2))
logging.info("received answer: %s", ans)
try:
if int(ans) != number1+number2:
raise ValueError
logging.info("{} is the correct answer".format(ans))
except (ValueError,TypeError):
logging.info("{} is incorrect answer".format(ans))
def main():
logging.basicConfig(level=logging.DEBUG, filename='log.log')
for x in range(10):
app()
if __name__ == '__main__':
main()
을 다음과 같은 app.py라는 스크립트 내가 아주 못생긴 코드
import queue
import time
import threading
import subprocess
import os
import pty
import re
class ReadStdout(object):
def __init__(self):
self.queue = queue.Queue()
self._buffer_ = []
def timer(self, timeout=0.1):
buffer_size = 0
while True:
if len(self._buffer_) > buffer_size:
buffer_size = len(self._buffer_)
time.sleep(timeout)
if len(self._buffer_) == buffer_size and buffer_size!=0:
self.queue.put(''.join(self._buffer_))
self._buffer_ = []
buffer_size = 0
def read(self, fd):
while True:
self._buffer_.append(fd.read(1))
def run(self):
timer = threading.Thread(target=self.timer)
timer.start()
master, slave = pty.openpty()
p = subprocess.Popen(['python', 'app.py'], stdout=slave, stderr=slave, stdin=subprocess.PIPE, close_fds=True)
stdout = os.fdopen(master)
read_thread = threading.Thread(target=self.read, args=(stdout,))
read_thread.start()
while True:
if self.queue.empty():
time.sleep(0.1)
continue
msg = self.queue.get()
digits = (re.findall('(\d+)', msg))
ans = (int(digits[0])+int(digits[1]))
print("got message: {} result: {}".format(msg, ans))
p.stdin.write(b"%d\n" %ans)
p.stdin.flush()
if __name__ == '__main__':
x = ReadStdout()
x.run()
내가 느끼지 않는다에게이 나는 올바른 방법으로 일을하고있다 . 다른 스크립트와 상호 작용하는 올바른 방법은 (내가, 표준 출력 표준 입력을뿐만 아니라 시각 장애인 쓰기 필요)
감사
가능한 중복 https://stackoverflow.com/questions/12980148/using-pythons -subprocess-and-popen-in-one-script-to-run-another-python-script-w) –
은 다릅니다. 나는 프로세스에 표준을 보내는 방법을 안다. 하지만 stdout을 먼저 읽고 그 결과에 따라 stdin에 써야합니다. 위의 스레드는 stdout을 걱정하지 않으므로 표준 입력에서 블라인드 피드 만 사용하십시오. –
stdout을 읽을 수도 있지만 제대로 읽는지 확신 할 수 없습니다. input() 예제는 줄 바꿈을 보내지 않으므로 readline()이 작동하지 않습니다. 나는 (크기)를 읽을 수는 있지만 그것이 읽어야하는 "크기"인지 나는 모른다. "input()"문자열 크기의 크기를 알지 못한다고 가정합니다. –