【问题标题】:Python: no output from (Perl) subprocessPython:(Perl)子进程没有输出
【发布时间】:2015-01-27 16:05:06
【问题描述】:

所以我想从 Python 中获取一个 Perl 脚本来激活,一段时间后我已经到了执行它的阶段,但我没有得到任何输出,我不知道出了什么问题。

我什至不知道它是否识别脚本或输入文件,因为它接受所有内容并且不给出错误消息。

script = subprocess.Popen(["perl" , "C:\\Users\\...\\pal2nal.pl" , "C:\\Users\\...\\input_file" , "C:\\Users\\...\\output_file" ], stdout=subprocess.PIPE)

while True:
    line = script.stdout.readline()
    if line == b'' and script.poll() != None:
        break
    sys.stdout.write(line.decode('utf-8'))
    sys.stdout.flush()

output = script.communicate()[0]
exitCode = script.returncode 

如果有人感兴趣,这是脚本http://www.bork.embl.de/pal2nal/distribution/pal2nal.v14.tar.gz

这是我第一次使用子流程,并尝试过错误检查,但最终没有成功。

【问题讨论】:

  • 您正在读取循环中的输出,因此输出将为空,您还应该添加stderr=PIPEfor line in iter(script.stdout.readline,b""): print(line) 将读取输出。如果你希望它存储在输出中删除你的循环
  • 现在工作!谢谢你,你救了我。
  • 别担心,不客气
  • 请勿添加stderr=PIPE,除非您使用线程或异步同时读取两个管道。 io.

标签: python subprocess popen


【解决方案1】:

在子流程输出到达后立即逐行显示将其捕获到变量中:

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

lines = []
with Popen(["perl" , r"C:\Users\...\pal2nal.pl", 
            r"C:\Users\...\input_file", 
            r"C:\Users\...\output_file"],
           stdout=PIPE, bufsize=1) as p:
    for line in io.TextIOWrapper(p.stdout, encoding='utf-8'):
        print(line, end='')
        lines.append(line)
output = ''.join(lines)
print(len(lines), p.returncode)

【讨论】:

    猜你喜欢
    • 2016-11-19
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2012-09-24
    • 1970-01-01
    • 2020-10-18
    相关资源
    最近更新 更多