【发布时间】:2013-12-26 18:30:19
【问题描述】:
在shell脚本中,我们有以下命令:
/script1.pl < input_file| /script2.pl > output_file
我想使用模块subprocess 在 Python 中复制上述流。 input_file 是一个大文件,我无法一次读取整个文件。因此,我想将每一行,一个input_string 传递到管道流中并返回一个字符串变量output_string,直到整个文件被流式传输。
以下是第一次尝试:
process = subprocess.Popen(["/script1.pl | /script2.pl"], stdin = subprocess.PIPE, stdout = subprocess.PIPE, shell = True)
process.stdin.write(input_string)
output_string = process.communicate()[0]
但是,使用 process.communicate()[0] 会关闭流。我想保持直播以供以后直播。我尝试使用process.stdout.readline(),但程序挂起。
【问题讨论】:
-
/script1.pl < input_string读取名为input_string的文件,它不会将文字字符串input_string作为输入。 -
啊,我明白了。不过,我想为我的 python 实现提供一个实际的字符串。我将使用生成器遍历字符串,并且我想通过管道传递生成的字符串。
-
您的 shell 命令与 “保持流打开” 不兼容。您想在
output_string中放入什么(第一个字节、第一行、前 n 个字节、10 秒内到达的第一个字节)?顺便说一句,output_string = process.communicate(input_string)[0]重现了您的 shell 命令(如果我们使用字符串而不是文件)。 -
我很抱歉造成混乱。我的 shell 命令从一个包含很多行的大文件中读取,然后写入另一个文件。我无法在 python 中打开和读取整个文件。相反,我必须逐行阅读,并将每一行传递到管道流中。我想保持管道流打开,直到所有线路都通过它。
-
编辑了我的问题以澄清问题。谢谢。
标签: python subprocess pipe