此子流程代码在Python 2中可以完美地工作,但在Python 3中则不能。我该怎么办?

谢谢,

import subprocess

gnuchess = subprocess.Popen('gnuchess', stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE)

# Python 3 strings are Unicode and must be encoded before writing to a pipe (and decoded after reading)
gnuchess.stdin.write('e4\n'.encode())

while True:   
L = gnuchess.stdout.readline().decode()
L = L[0:-1]
print(L)
if L.startswith('My move is'):
    movimiento = L.split()[-1]
    break

print(movimiento)

gnuchess.stdin.write('exit\n'.encode())

gnuchess.terminate()

===============>>#1 票数:1

造成这种差异的最可能的原因是缓冲行为的变化,将bufsize=1设置为启用行缓冲。

为避免手工编码/解码,可以使用universal_newlines=True启用文本模式(使用locale.getpreferredencoding(False)字符编码来解释数据)。

#!/usr/bin/env python3
from subprocess import Popen, PIPE, DEVNULL

with Popen('gnuchess', stdin=PIPE, stdout=PIPE, stderr=DEVNULL,
           bufsize=1, universal_newlines=True) as gnuchess:
    print('e4', file=gnuchess.stdin, flush=True)
    for line in gnuchess.stdout:
        print(line, end='')
        if line.startswith('My move is'):            
            break
    print('exit', file=gnuchess.stdin, flush=True)

如果gnuchess接受exit命令,则无需调用gnuchess.terminate()

直到“我的举动是”这句话之前,阅读台词似乎都很脆弱。 研究gnuchess是否提供具有更严格输出分离的批处理模式。

  ask by Diego Andres Alvarez Marin translate from so

未解决问题?本站智能推荐:

2回复

子进程语句在python控制台中有效,但在Serverdensity插件中无效?

在python控制台中,以下语句可以很好地工作(我想以这种方式使用eval并不是很好,但是在这种情况下,它仅用于测试目的,将被适当的解析所代替) 当我将其转换为Serverdensity插件时,每次执行插件时,它都会不断使agent.py守护程序崩溃。 我能够将其范围缩小到子流程行,但
2回复

python-JAR在终端中有效,但在python中不起作用

我正在使用python 3脚本来做一些实验(学校目的)。 所以我需要调用我的JAR。 我为此使用subprocess.check_output。 在终端中,它工作正常,我得到了预期的输出,退出代码为0。但是在python中,我得到了: 这对我来说没有任何意义。 谁能帮我 ?
1回复

Python 2.7子进程不返回任何内容,确切的命令在控制台中有效

我正在尝试在Python脚本中执行strings命令。 我让它工作了一段时间,但神秘的是,当我使用subprocess.Popen时,它什么也没有返回。 从终端呼叫 在Python Shell中: 第二个什么也不返回。 为什么?
1回复

Python子进程有效地检查子进程是否终止

我正在使用子进程运行此bash cmd,以在远程系统中启动jmeter。 现在我正在使用while loop来检查子进程是否终止以及是否终止了如下所示的刷新日志文件 但是,这个while loop我的进程达到了100%的CPU利用率。 我想知道是否还有其他方法可以有效地检查
1回复

在python 3中使用子进程

我正在使用子进程模块在python 3中运行shell命令。 这是我的代码 不同文件的输出仅为0或1 。 我是python 3的新手,在2.7中使用它可以提供所需的输出,但是在这里我无法弄清楚。 这是我在python 2.7中获得的输出(对于名为anu.py的文件)-
1回复

在python中检查子进程

我正在尝试使用subprocess从另一个运行一个python程序。 这是我到目前为止所拥有的功能: 然后我跑: 但出现OS error: no such file ,但是它没有告诉我不存在哪个文件。 莫名其妙。 有什么建议么? 我可以将runProcess函数用于普通的
1回复

python中的子进程效率来解释

我在这里询问python子进程的效率。 我正在尝试创建一个程序,该程序需要能够执行其他语言的代码。 例如,假设我需要运行js文件(因此我将使用节点解释器) 我正在使用一个简单的代码(基于我之前问过的关于Kotlin ProcessBuilder vs python的问题),而且我不明白为什么为什
1回复

python子进程中的子shell

在python脚本中,我需要启动一个命令,例如 使用子进程,我尝试使用https://stackoverflow.com/a/29755431/1355628的函数拆分命令 该函数对带有管道的简单命令很好用,但是不幸的是,上面的命令似乎不起作用(返回代码似乎是完全随机的...)
1回复

python中的子进程错误

我正在使用PDFminer将pdf转换为html文件。 错误代码: 上面的代码应该在外壳中运行“ pdf2txt.py -o /Users/andy/GoogleDrive/Debate/intelligencesquaredus/data/040214_MOOCs.html /U
1回复

子进程python中的错误

在Linux中,如果我在终端中执行以下命令: 有用。 但是,如果我在IPython终端中执行: 我有这个错误: 为什么子进程无法执行此终端命令?