加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

Windows上的Python子进程输出?

发布时间:2020-12-14 02:00:49 所属栏目:Windows 来源:网络整理
导读:我在从子进程stdout管道获取输出时遇到了一些困难.我正在通过它启动一些第三方代码,以便提取日志输出.直到最近更新第三方代码,一切正常.更新后,python已无限期地开始阻塞,并且实际上没有显示任何输出.我可以手动启动第三方应用程序并查看输出. 我正在使用的
我在从子进程stdout管道获取输出时遇到了一些困难.我正在通过它启动一些第三方代码,以便提取日志输出.直到最近更新第三方代码,一切正常.更新后,python已无限期地开始阻塞,并且实际上没有显示任何输出.我可以手动启动第三方应用程序并查看输出.

我正在使用的代码的基本版本:

import subprocess,time
from threading import Thread

def enqueue_output(out):
    print "Hello from enqueue_output"
    for line in iter(out.readline,''):
        line = line.rstrip("rn")
        print "Got %s" % line
    out.close()

proc = subprocess.Popen("third_party.exe",stdout=subprocess.PIPE,bufsize=1)
thread = Thread(target=enqueue_output,args=(proc.stdout,))
thread.daemon = True
thread.start()

time.sleep(30)

如果我将third_party.exe替换为此脚本,则此方法非常有效:

import time,sys

while True:
    print "Test"
    sys.stdout.flush()
    time.sleep(1)

所以我不清楚魔法需要做什么才能使用原始命令.

这些都是subprocess.Popen行的所有变种我试过没有成功:

proc = subprocess.Popen("third_party.exe",bufsize=0)
proc = subprocess.Popen("third_party.exe",shell=True)
proc = subprocess.Popen("third_party.exe",creationflags=subprocess.CREATE_NEW_CONSOLE)
si = subprocess.STARTUPINFO()
si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen("third_party.exe",startupinfo=si)

编辑1:
在这种情况下,我实际上无法使用.communicate().我正在推出的应用程序仍然运行很长一段时间(几天到几周).我实际测试.communicate()的唯一方法就是在启动后立即杀死应用程序,我觉得不会给我有效的结果.

即使非线程版本也失败了:

import subprocess,time
from threading import Thread

proc = subprocess.Popen("third_party.exe",stderr=subprocess.PIPE)

print "App started,reading output..."
for line in iter(proc.stdout.readline,''):
    line = line.rstrip("rn")
    print "Got: %s" % line

编辑2:
感谢jdi,以下工作正常:

import tempfile,time,subprocess

w = "test.txt"
f = open("test.txt","a")
p = subprocess.Popen("third_party.exe",shell=True,stdout=f,stderr=subprocess.STDOUT,bufsize=0)

time.sleep(30)

with open("test.txt",'r') as r:
    for line in r:
        print line
f.close()

解决方法

首先,我建议您简化此示例以确保您可以实际读取任何内容.从混合中删除线程的复杂性:

proc = subprocess.Popen("third_party.exe",bufsize=1)
print proc.communicate()

如果有效,那很好.然后你可能会遇到直接或可能在你的线程中读取stdout的问题.

如果这不起作用,你是否尝试过stderr到stdout?

proc = subprocess.Popen("third_party.exe",bufsize=1)

更新

既然你说communication()是死锁,那么你可以尝试另一种方法来看看它是否与子进程的内部缓冲区有问题…

import tempfile
import subprocess

w = tempfile.NamedTemporaryFile()
p = subprocess.Popen('third_party.exe',stdout=w,bufsize=0)

with open(w.name,'r') as r:
    for line in r:
        print line
w.close()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读