2015-05-16 117 views
0

這個子過程代碼在Python 2中完美工作,但在Python 3中完美工作。我該怎麼辦?子過程在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() 
+2

當它不起作用時會發生什麼?你有例外嗎?如果是這樣,請包含回溯。如果你有其他行爲,請描述它。 – Blckknght

回答

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.terminate()如果gnuchess接受exit命令。

直到'我的舉動是'這句話,看起來很脆弱。調查gnuchess是否提供具有更嚴格輸出間隔的批處理模式。

相關問題