首页新闻找找看学习计划

Python 使用subprocess调用会进入死循环的子进程时,如何获取输出

-1
[待解决问题]

我有一个程序,这个程序运行后自动打印一段文字,然后进入死循环。
我写了一个python脚本,用subprocess去调用这个程序,想从子进程的stdout中read子进程打印的结果。但是脚本被阻塞住了,需要敲回车才能继续运行。
有什么办法可以不阻塞然后或者子程序打印的文本呢?

思麦儿的主页 思麦儿 | 菜鸟二级 | 园豆:204
提问于:2018-03-26 21:05
< >
分享
所有回答(2)
0

stdin

北方姆Q | 园豆:856 (小虾三级) | 2018-03-27 10:09

具体怎么操作呢?脚本所在的控制台stdin只能读吧?

支持(0) 反对(0) 思麦儿 | 园豆:204 (菜鸟二级) | 2018-03-27 12:14

@思麦儿: stdin就是用来交互的,比如你要执行的脚本里需要你输入Y/N

p = subprocess.Popen('python3',stdin=subprocess.PIPE,stdout=subprocess.PIPE, stderr=subprocess.PIPE,shell=True)

p.stdin.write(XXXX)

支持(0) 反对(0) 北方姆Q | 园豆:856 (小虾三级) | 2018-03-27 13:51

@北方姆Q 我要调用的程序是死循环,需要在主进程敲回车而不是在子进程中敲回车,所以不是往子进程的stdin写数据

支持(0) 反对(0) 思麦儿 | 园豆:204 (菜鸟二级) | 2018-03-27 14:22

@思麦儿: 我给你的只是个例子

支持(0) 反对(0) 北方姆Q | 园豆:856 (小虾三级) | 2018-03-27 14:58

@北方姆Q 那大神你可有办法?

支持(0) 反对(0) 思麦儿 | 园豆:204 (菜鸟二级) | 2018-03-27 20:54

@思麦儿: 代码

支持(1) 反对(0) 北方姆Q | 园豆:856 (小虾三级) | 2018-03-27 22:58
0

没有理解为什么要在主进程敲回车,这个主进程不是你自己控制的吗?

我有一个循环打印的方法,不知道可不可行

def run_shell(command):
    # print command
    p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
    while True:
        r = p.stdout.readline().strip().decode('utf-8')
        if r:
# print r
yield r if p.poll() != None and not r: break
Masako | 园豆:1751 (小虾三级) | 2018-03-28 09:50

其实主要问题是因为stdout

支持(0) 反对(0) 思麦儿 | 园豆:204 (菜鸟二级) | 2018-04-04 19:59

主要是因为子进程的stdout需要等到子进程结束之后才会有输出,但不知道为什么,我通过stdin传了信息之后,主进程会在stdout readline处卡住,需要敲一下键盘子进程才会结束

支持(0) 反对(0) 思麦儿 | 园豆:204 (菜鸟二级) | 2018-04-04 20:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册