作者clanguage (C语言)
看板Python
标题[问题] Popen印出讯息到stdout并存到变数
时间Mon Apr 15 12:50:05 2024
请问 subprocess.Popen 呼叫另一个程式的问题
需求是呼叫另一个程式将程式执行过程印出到画面(stdout)之外
同时把执行过程存到变数里做後续判断
例子如下, hello.py 要求使用者输入资料并印出,另一个程式 test.py呼叫 hello.py
想要储存 hello.py 的执行过程,但是如果设定stdout=PIPE,执行过程就不会显示提示
要使用者输入资料
不知道该怎麽设定?
hello.py
if __name__=='__main__':
name = input("please enter your name : ")
print("hello, "+name)
test.py
def run_cmd(cmd):
process = subprocess.Popen(cmd, universal_newlines=True, shell=True,
stdout=PIPE, stderr=PIPE)
stdout, stderr = process.communicate()
ret = process.returncode
return ret, stdout, stderr
def main():
retval, output, stderr = run_cmd("hello.py")
print(f"\nResult:\n{output}")
sys.exit(0)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 218.172.71.29 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1713156607.A.E66.html
※ 编辑: clanguage (218.172.71.29 台湾), 04/15/2024 12:50:47
※ 编辑: clanguage (218.172.71.29 台湾), 04/15/2024 12:51:28
1F:推 DaOppaiLoli: 应该是要改 stdin 把使用者输入丢进去 04/15 12:56
2F:推 DaOppaiLoli: 我看懂你的意思了,你可以在 communicate 之前呼叫 04/15 13:07
3F:→ DaOppaiLoli: process.stdout.readline() 把输出行印出来 04/15 13:07
4F:→ DaOppaiLoli: 但子程序要输出换行才行,也可以用 .read(5) 之类的 04/15 13:08
5F:推 DaOppaiLoli: 大概会像这样 04/15 13:11
6F:→ DaOppaiLoli: import subprocess as sp 04/15 13:11
7F:→ DaOppaiLoli: p = sp.Popen(["python", "a.py"], stdout=sp.PIPE) 04/15 13:11
8F:→ DaOppaiLoli: while p.poll() != 0: 04/15 13:11
9F:→ DaOppaiLoli: print(p.stdout.read(1), flush=True) 04/15 13:11
10F:→ DaOppaiLoli: res = p.communicate() 04/15 13:11
11F:→ DaOppaiLoli: print(res) 04/15 13:11
12F:→ lycantrope: communicate就会poll了 为何还要一个for loop 04/15 14:04
13F:→ clanguage: 谢谢D大有方向了 04/15 19:58