@@ -80,32 +80,41 @@ def __init__(self, engine_path: Path, pos_fen: str):
8080 text = True ,
8181 )
8282
83- self .engine . stdin . write ("uci\n " )
83+ self .send_command ("uci" )
8484
8585 # skip greeting & info/options output
8686 for line in self .engine .stdout :
8787 if line .strip () == "uciok" :
8888 break
8989
90- self .engine . stdin . write ("ucinewgame\n " )
91- self .engine . stdin . write ("isready\n " )
90+ self .send_command ("ucinewgame" )
91+ self .send_command ("isready" )
9292
93- self .engine . stdout . readline () # "readyok" response
93+ self .readline () # "readyok" response
9494
95- self .engine .stdin .write (f"position fen { pos_fen } \n " )
95+ self .send_command (f"position fen { pos_fen } " )
96+
97+ def send_command (self , command ):
98+ self .engine .stdin .write (f"{ command } \n " )
99+ self .engine .stdin .flush ()
100+
101+ def readline (self ):
102+ return self .engine .stdout .readline ()
96103
97104 def run_perft (self , depth : int ) -> dict [str , int ]:
98- self .engine . stdin . write (f"perft { depth } json\n " )
105+ self .send_command (f"perft { depth } json" )
99106
100- # info line
101- self .engine .stdout .readline ()
107+ self .readline () # info line
102108
103- return json .loads (self .engine . stdout . readline ())
109+ return json .loads (self .readline ())
104110
105111 def __del__ (self ):
106- self .engine .communicate ("quit\n " , timeout = 15 )
107- self .engine .kill ()
108- self .engine .communicate ()
112+ self .send_command ("quit" )
113+
114+ if self .engine :
115+ self .engine .stdin .close ()
116+ self .engine .stdout .close ()
117+ self .engine .wait ()
109118
110119
111120#
0 commit comments