Однако, если создается несколько экземпляров моего скрипта, программа перестает работать примерно через 15 минут. Я предполагаю, что это тупик из-за полного буфера, описанного в документации. К сожалению, я не могу использовать рекомендуемую функцию «общения», поскольку мне нужно постоянно изменять как ввод, так и вывод. Есть ли способ справиться с этим? Вот минимальная версия того, что я делаю:
Код: Выделить всё
import sys
import time
import subprocess
import threading
class ChessEngine:
def __init__(self):
self.lock = threading.Lock()
def write(self, command):
with self.lock:
self.engine.stdin.write(command + "\n")
self.engine.stdin.flush()
def read_stdout(self):
while True:
text = self.engine.stdout.readline()
text = text.replace("foo", "bar")
print(text, end="", flush=True)
def read_stdin(self):
while True:
command = input()
command = command.replace("foo", "bar")
self.write(command)
def run(self):
self.engine = subprocess.Popen(
"/usr/games/stockfish",
shell=True,
universal_newlines=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
bufsize=1,
cwd=self.folder,
)
threading.Thread(target=self.read_stdout, daemon=True).start()
threading.Thread(target=self.read_stdin, daemon=True).start()
while True:
time.sleep(1)
if not self.engine.poll() is None:
sys.exit(0)
if __name__ == "__main__":
chess_engine = ChessEngine()
chess_engine.run()
Подробнее здесь: https://stackoverflow.com/questions/790 ... and-stdout