python父进程调用子进程_Python2.7下,调用subprocess启动子进程,读取子进程标准输出若干问题...
1:如果调用的子进程也是一个python脚本,则subprocess.Popen中的bufsize=1无效果。也就是说,即使设置了bufsize=1表示进行行缓冲,子进程如果不显示调用sys.stdout.flush,父进程依然会阻塞在readline上:
#testbuf.py
importsubprocess
cmd= "./testsub.sh"cmd2= ["python", "testsub.py"]
sp= subprocess.Popen(cmd2, bufsize = 1, stdout =subprocess.PIPE)whileTrue:
line=sp.stdout.readline()print 'read line is', lineif not line: break
testsub.py代码如下:
importtimeimportsysfor i in range(100000):print 'hello, world', i#sys.stdout.flush()
time.sleep(1)
执行testbuf.py脚本,该脚本将会阻塞在sp.stdout.readline()上,除非将子进程testsub杀掉,否则,该脚本将会长时间阻塞在这条语句上。
如果将testsub.py中的sys.stdout.flush()前注释去掉,则父进程可以得到正常的输出。
如果执行的是shell脚本testsub.sh,则没有这种问题,该脚本代码如下:
#!/bin/bashfor((i=1;i<=10000000;i++));do
echo“hello, world”, $isleep 1
done
2:如果子进程是一个长时间运行的程序,而父进程想以行为单位实时读取子进程的输出,则父进程不能以for line in sp.stdout的形式读取子进程输出:
#testbuf.py
import subprocess
cmd= "./testsub.sh"cmd2= ["python", "testsub.py"]
sp= subprocess.Popen(cmd2, bufsize = 1, stdout =subprocess.PIPE)for line insp.stdout:
print'read line is', lineif not line: break
这种情况下,进程阻塞在for line in sp.stdout上。这实际上是python2的一个bug:
https://bugs.python.org/issue3907
https://stackoverflow.com/questions/2804543/read-subprocess-stdout-line-by-line
https://ubuntuforums.org/showthread.php?t=916518
这个bug在python3中据说解决了,但是在python2下,还是不可以用for line in sp.stdout这种形式。可以使用readline:
for line in iter(proc.stdout.readline,''):
print line
3:如果子进程有大量输出,而父进程调用subprocess.Popen时又设置了stdout = subprocess.PIPE,并且没有及时读取stdout中的内容,则一旦缓冲区满了(缓冲区默认大小为65535),则子进程会在写入标准输出时hang住。
python父进程调用子进程_Python2.7下,调用subprocess启动子进程,读取子进程标准输出若干问题...相关推荐
- python基础-进程池、submit同异步调用、shutdown参数、ProcessPoolExecutor进程池、进程池ftp
引入进程池 使用ProcessPoolExecutor进程池 使用shutdown 使用submit同步调用 使用submit异步调用 进程池实现ftp 引入进程池 在学习线程池之前,我们先看一个例子 ...
- python replace函数 成功 失败_请教下调用python string模块的replace方法出错的原因
直接调用没有问题 def test1(): test_str="028-123456" print test_str.replace(old="-",new=& ...
- linux父进程中显示子进程pid,请教linux下c语言函数fork父进程打印子进程的PID
请教linux下c语言函数fork父进程打印子进程的PID 关注:296 答案:2 信息版本:手机版 解决时间 2019-01-14 04:55 雨不眠的下 2019-01-13 12:23 用于 ...
- Linux 的父进程和子进程的执行情况(附有案例代码)
系列文章目录 该文章主要是针对面试做大致的了解,通俗易懂!!! 一.父进程.子进程的定义 1.父进程 指已创建一个或多个子进程的进程.在Linux里,除了进程0以外的所有进程都是由其他进程使用系统调用 ...
- 信号量SIGCHLD的使用,如何让父进程得知子进程执行结束,如何让父进程区分多个子进程的结束
本教程基于 Ubuntu 20.10 gcc 10.2.0. 示例程序如果不能正常编译和执行,说明您系统和工具版本与我的不匹配,请自行查阅资料. 0 概述 先给出该信号的描述: Signal Valu ...
- fork、vfork函数及父进程与子进程
进程A创建了进程B,则称进程A为父进程,进程B为子进程 #include <stdio.h> #include <sys/types.h> #include <unist ...
- 父进程退出后,子进程自动消亡
今日做项目,通过systemctl去管理服务A.因为A依赖很多动态库,所以实际执行的时候,是由B这个脚本将A带起来.这样,systemctl start A时,实际上是B先运行起来,然后B将A带起来. ...
- Linux系统编程之进程退出,父进程等待子进程退出
1.首先讲一下进程的退出 进程的退出分为正常退出和异常退出: 正常退出: (1)main函数调用return (2)进程调用exit(),标准C库 (3)进程调用_exit()或_Exit(),属于系 ...
- fork()产生的子进程ppid有时不是父进程pid-Linux中的僵尸进程处理
文章首发及后续更新:https://mwhls.top/929.html 新的更新内容请到mwhls.top查看. 无图/无目录/格式错误/更多相关请到上方的文章首发页面查看. 写完之后,我想到了更严 ...
最新文章
- 在Android使用XML文件控制按钮文字在各种状态下的颜色
- php 常见的算法题,php最常见最经典的算法题(1)
- 本地打开extjs api docs 的方法
- hibernate乐观锁_Hibernate Collection乐观锁定
- 1.关于python
- python中split函数_python strip()函数和Split函数的用法总结
- 获取Access表字段类型的自定义函数
- java 课后习题 编写判断从键盘输入的字符串是否为回文
- 域 正在应用计算机设置,入域的时候卡在”正在应用计算机设置”持续了好几分钟...
- java输出重定向gui_Java – 将system.out.println重定向到JLabel
- 【java】RMI教程:入门与编译方法 远程
- 如何自定义苹果Mac睡眠时间,掌握作息?
- PID算法的原理和公式
- Vue — jTopo
- 用PHP搞掂黑群晖IPv6的DNSPod解析【7月23日更新,支持v4和v6】
- 苹果手机又刷屏啦!!它是如何做到的?
- 回音消除--富迪科技
- 简单体验阿里巴巴在线java诊断工具Arthas
- 深度!推动“企业上云”光有补贴不够,还要看这5点
- 电子竞技——靠智力取胜的体育项目
热门文章
- SAP Spartacus的全局配置
- 蛙泳如何找准背部发力的感觉
- Groovy里的运行时元数据编程(metata programming)
- CL_FXS_URL_DATA_FETCHER - a good utility to fetch picture binary data according to url
- SAP UI5里的abap.js
- connect SAP Hybris Enterprise Commerce Platform to SAP Kyma
- Marketing Cloud profile界面功能介绍
- 为什么CRM WebClient UI每次点了回车都会触发到后台的roundtrip
- 如何查看其他人的ABAP authorization check log
- How to resolve ATC error message Package Violation (Error) - Missing Use Access (USEM)