这篇文章主要介绍Python从子流程运行的子进程中如何实时获取输出的例子,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
有些时候,我们需要将某些程序放到子进程中去运行,以达到整合系统的目的。在Python中,一个非常好的选择就是使用子流程模块,本模块为开辟子进程去执行子程序提供了统一的接口,更加便于学习和使用。
同时,对于在子进程里的程序,我们希望能够实时获取其输出,以在主进程中打印相关信息,使我们能够了解当前子程序的执行进度。对,此子流程模块也提供了相应的参数,能够将子程序的标准输出和标准错误输出返回给主程序。
下面,我们就通过一个例子来说明这个功能。首先,我们需要一个用于模拟标准输出和标准错误输出的“子程序”——子程序。py:
import 系统 import 时间 , , for 小姐:拷贝范围(5): sys.stdout.write才能(& # 39;Processing {} \ n # 39; .format(我)) time . sleep才能(1) , for 小姐:拷贝范围(5): sys.stderr.write才能(& # 39;Error {} \ n # 39; .format(我)) time . sleep才能(1)
可以看到这个程序非常简单,分别向标准输出和标准错误写入了5条信息,并且输出之间有1秒的间隔。下面是驱动这个“子程序”运行的“主程序”——主要。py:
import shlex import 子流程 , if __name__ ==, & # 39; __main__ # 39;: 时间=shell_cmd 才能;& # 39;python3 subprogram.py& # 39; 时间=cmd 才能;shlex.split (shell_cmd) p 才能=,subprocess.Popen (cmd, shell=False,, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) while 才能;p.poll (), is 没有: ,,,line =, p.stdout.readline () ,,,line =, line.strip () ,,,if 线: ,,,,,印刷(& # 39;Subprogram 输出:,({})& # 39;.format(线)) if 才能;p.returncode ==, 0: ,,,print (& # 39; Subprogram 成功# 39;) 其他的才能: ,,,print (& # 39; Subprogram 失败# 39;)
可以看的到,我们通过指定stderr=subprocess.STDOUT,将子程序的标准错误输出重定向到了标准输出,以使我们可以直接从标准输出中同时获取标准输出和标准错误的信息。运行这个程序,我们会期待main.py会每秒输出一次信息到控制台,但是事实上,我们直到等了10秒之后才一次性看到所有的10条输出。
产生这种现象的原因也非常简单,就是标准输出和标准错误有一个缓存的概念,它不会立即将程序的标准输出内容返回,而是会做一定的缓存,直到缓存满或者程序结束强制清空缓存时才输出。了解到问题的原因,解决问题的方法也就一目了然了,我们只需要在子程序中,每次输出后去手动清空一下缓存即可,以下是修改过的子程序。py:
import 系统 import 时间 , , for 小姐:拷贝范围(5): sys.stdout.write才能(& # 39;Processing {} \ n # 39; .format(我)) sys.stdout.flush才能() time . sleep才能(1) , for 小姐:拷贝范围(5): sys.stderr.write才能(& # 39;Error {} \ n # 39; .format(我)) sys.stderr.flush才能() time . sleep才能(1)
经过上述的修改之后,再次运行主要。py程序,我们会看的到,每秒会输出一条信息,达到了我们在主程序中,去追踪子程序执行过程的目的。
Python主要用来做什么
Python主要应用于:1,网络开发;2、数据科学研究;3,网络爬虫;4、嵌入式应用开发,5日游戏开发;6桌面应用开发。
以上是“Python从子流程运行的子进程中如何实时获取输出的例子”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!