Python 3子进程管道块

时间:2015-11-20 15:58:25

标签: python python-3.x subprocess

在python 2.7中,这可以工作并返回预期的字符串it works!

process = subprocess.Popen(['/bin/bash'], shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
process.stdin.write('echo it works!\n')
print process.stdout.readline()

当我知道在python 3.4中尝试这个时,它会陷入readline命令

process = subprocess.Popen(['/bin/bash'], shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
process.stdin.write(bytes('echo it works!\n','UTF-8'))
print(process.stdout.readline().decode('UTF-8'))

1 个答案:

答案 0 :(得分:3)

关于缓冲的提示很有帮助。可以在Subprocess库模块文档中找到以下信息:

  

bufsize将作为open()的相应参数提供   创建stdin / stdout / stderr管道文件对象时的函数:

     

0表示无缓冲(读写是一个系统调用,可以返回短路)

     

1表示行缓冲(仅当universal_newlines = True时才可用,即在文本模式下)

  

如果universal_newlines为False,则文件对象为stdin,stdout和   stderr将作为二进制流打开,并且没有行结束转换   完了。

     

如果universal_newlines为True,则将打开这些文件对象   使用locale.getpreferredencoding(False)返回的编码以通用换行模式播放文本流

将所有内容放在一起会产生以下Python3代码:

import subprocess
process = subprocess.Popen(['/bin/bash'], shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=1, universal_newlines=True)
process.stdin.write('echo it works!\n')
print(process.stdout.readline())