【问题标题】:None in redirected stdout重定向标准输出中没有
【发布时间】:2016-04-22 07:44:26
【问题描述】:

我有以下代码的这一部分:

p = subprocess.Popen(['C:/Python27/python.exe', '-m', 'robot', '-d', logs_directory, input_file], stdout=subprocess.PIPE)
for line in iter(p.stdout.readline, ''):
    output = sys.stdout.write(line)
    #sys.stdout.write(line)
print "\n\n"
print "************************************************"
print  output
print "\n\n"
print "************************************************"
print "\n\n"

但控制台中的“输出”变量显示“无”

************************************************
None



************************************************

我在这里做错了什么?

【问题讨论】:

标签: python subprocess stdout


【解决方案1】:

sys.stdout.write(line) 返回写入标准输出的字符数。

你可以这样写你的循环:

output = ""
for line in iter(p.stdout.readline, ''):
    output += line
    sys.stdout.write(line)

恕我直言,您也可以删除 sys.stdout.write(line) 部分。但我不知道你打算用它做什么......

【讨论】:

  • sys.stdout.write(line) 确实返回一个值。它返回写入标准输出的字符数。
  • 1- sys.stdout.write() 默认在 Python 2 上返回 None。 2- output += line 可能会在某些 Python 实现中产生二次行为。您可以改用lines = []; ... lines.append(line) ... output = ''.join(lines)(线性行为)。
【解决方案2】:

尝试output += line 而不是output = sys.stdout.write(line)

【讨论】:

    【解决方案3】:

    你也可以试试check_output函数。

    这是一个例子:

    >>> subprocess.check_output(["echo", "Hello World!"])
    'Hello World!\n'
    

    你可以试试:

    cmd = ['C:/Python27/python.exe', '-m', 'robot', '-d', logs_directory, input_file]
    output = subprocess.check_output(cmd)
    print output
    

    在大多数情况下,它可以简单地完成工作。

    详情可参考subprocess.check_output

    【讨论】:

    • 正确,但我也想将结果打印到控制台,在这种情况下 check_output 是不够的。
    • 我不明白你为什么认为check_output 不够。您只需将其返回值分配给一个变量,然后打印到控制台。
    • 这不会是“实时”打印。当子进程结束时,我将获得控制台输出。我想有控制台输出,所以我可以看到子进程的进度
    • 好的,我明白了。谢谢!
    猜你喜欢
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多