【问题标题】:How to use stdin when stdin is redirected?重定向标准输入时如何使用标准输入?
【发布时间】:2022-11-10 08:00:07
【问题描述】:

我正在尝试使用 lichess-bot 为 lichess 创建一个 CLI 界面

链接:https://github.com/ShailChoksi/lichess-bot

移动是通过创建一个扩展 MinimalEngine 的类并给它一个返回移动的搜索方法来进行的。

例如,这很有效,我在 lichess 上对其进行了测试,它是一个随机的合法动作。

class RandomMove(ExampleEngine):
    def search(self, board, *args):
        return PlayResult(random.choice(list(board.legal_moves)), None)

我的计划是使用 input() 替换此功能,以从玩家那里获取 uci 移动字符串,然后让机器人播放该移动。

然而,仅此一项就打破了它

class RandomMove(ExampleEngine):
    def search(self, board, *args):
        mv = input("Give me a move")
        return PlayResult(random.choice(list(board.legal_moves)), None)

当我在代码中使用 input() 运行时,我会重复此输出:

 INFO     Backing off play_game(...) for 19.9s (EOFError: EOF when reading a line) 

如果我从搜索方法中 print(sys.stdin) 我得到这个输出:

<_io.TextIOWrapper name=21 mode='r' encoding='UTF-8'>

但是,如果我从我自己的 python 文件中打印(sys.stdin),我会得到:

stdin <_io.TextIOWrapper name='<stdin>' mode='r' encoding='utf-8'>

我想 lichess-bot 必须以某种方式覆盖/重定向标准输入,我的问题是,如果是这种情况,我怎么还能读取用户输入,是否有一些技巧可以重新建立标准输入,然后在我完成时将其设置回来,或者可能有什么在单独的线程/进程上运行我的 input() ?

【问题讨论】:

    标签: python io lichess


    【解决方案1】:

    尝试这个 :

    class RandomMove(ExampleEngine):
        def search(self, board, *args):
            mv = input("Give me a move")
            return PlayResult(chess.Move.from_uci(mv), None)
    

    实际上,您的函数必须返回 PlayResult(chess.Move) 类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      相关资源
      最近更新 更多