在Windows 7上,我可以通过命令行与国际象棋引擎通信。在Win 7上使用Stockfish的小示例会话:
C:\run\Stockfish>stockfish-x64.exe
Stockfish 2.2.2 JA SSE42 by Tord Romstad, Marco Costalba and Joona Kiiski
quit
C:\run\Stockfish>
第一行是引擎的输出,“quit”是我输入的退出引擎的内容(有other things I can do,但我很清楚)。
现在我想和python的引擎通信:
import subprocess
engine = subprocess.Popen(
'stockfish-x64.exe',
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
)
for line in engine.stdout:
print(line.strip())
engine.stdin.write('quit\n')
然后我得到
C:\run\Stockfish>communicate.py
b'Stockfish 2.2.2 JA SSE42 by Tord Romstad, Marco Costalba and Joona Kiiski'
但是它没有退出引擎(没有C:\run\Stockfish>
提示符),它一直在等待输入,我不得不手动关闭窗口,它似乎没有得到我的退出消息(python脚本的最后一行)写入stdin。
换句话说,我可以从stdout读取数据,但是当我向stdin写入数据时,什么也没发生。
我做错了什么?如何做对?
3条答案
按热度按时间mwngjboj1#
你陷入了僵局:子进程正在等待输入,而您的程序正在等待它在中输出更多行
此循环仅在子进程关闭其
stdout
时停止。nzrxty8p2#
您可能希望像python国际象棋那样使用asyncio。请参见
engine.py
而documentation的例子
lo8azlld3#
我把问题中的编辑移到这个答案中。
多亏了拉斯曼的帮助,我解决了这个问题。
Python脚本示例:
输出: