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启动子进程,读取子进程标准输出若干问题...相关推荐

  1. python基础-进程池、submit同异步调用、shutdown参数、ProcessPoolExecutor进程池、进程池ftp

    引入进程池 使用ProcessPoolExecutor进程池 使用shutdown 使用submit同步调用 使用submit异步调用 进程池实现ftp 引入进程池 在学习线程池之前,我们先看一个例子 ...

  2. python replace函数 成功 失败_请教下调用python string模块的replace方法出错的原因

    直接调用没有问题 def test1(): test_str="028-123456" print test_str.replace(old="-",new=& ...

  3. linux父进程中显示子进程pid,请教linux下c语言函数fork父进程打印子进程的PID

    请教linux下c语言函数fork父进程打印子进程的PID 关注:296  答案:2  信息版本:手机版 解决时间 2019-01-14 04:55 雨不眠的下 2019-01-13 12:23 用于 ...

  4. Linux 的父进程和子进程的执行情况(附有案例代码)

    系列文章目录 该文章主要是针对面试做大致的了解,通俗易懂!!! 一.父进程.子进程的定义 1.父进程 指已创建一个或多个子进程的进程.在Linux里,除了进程0以外的所有进程都是由其他进程使用系统调用 ...

  5. 信号量SIGCHLD的使用,如何让父进程得知子进程执行结束,如何让父进程区分多个子进程的结束

    本教程基于 Ubuntu 20.10 gcc 10.2.0. 示例程序如果不能正常编译和执行,说明您系统和工具版本与我的不匹配,请自行查阅资料. 0 概述 先给出该信号的描述: Signal Valu ...

  6. fork、vfork函数及父进程与子进程

    进程A创建了进程B,则称进程A为父进程,进程B为子进程 #include <stdio.h> #include <sys/types.h> #include <unist ...

  7. 父进程退出后,子进程自动消亡

    今日做项目,通过systemctl去管理服务A.因为A依赖很多动态库,所以实际执行的时候,是由B这个脚本将A带起来.这样,systemctl start A时,实际上是B先运行起来,然后B将A带起来. ...

  8. Linux系统编程之进程退出,父进程等待子进程退出

    1.首先讲一下进程的退出 进程的退出分为正常退出和异常退出: 正常退出: (1)main函数调用return (2)进程调用exit(),标准C库 (3)进程调用_exit()或_Exit(),属于系 ...

  9. fork()产生的子进程ppid有时不是父进程pid-Linux中的僵尸进程处理

    文章首发及后续更新:https://mwhls.top/929.html 新的更新内容请到mwhls.top查看. 无图/无目录/格式错误/更多相关请到上方的文章首发页面查看. 写完之后,我想到了更严 ...

最新文章

  1. 在Android使用XML文件控制按钮文字在各种状态下的颜色
  2. php 常见的算法题,php最常见最经典的算法题(1)
  3. 本地打开extjs api docs 的方法
  4. hibernate乐观锁_Hibernate Collection乐观锁定
  5. 1.关于python
  6. python中split函数_python strip()函数和Split函数的用法总结
  7. 获取Access表字段类型的自定义函数
  8. java 课后习题 编写判断从键盘输入的字符串是否为回文
  9. 域 正在应用计算机设置,入域的时候卡在”正在应用计算机设置”持续了好几分钟...
  10. java输出重定向gui_Java – 将system.out.println重定向到JLabel
  11. 【java】RMI教程:入门与编译方法 远程
  12. 如何自定义苹果Mac睡眠时间,掌握作息?
  13. PID算法的原理和公式
  14. Vue — jTopo
  15. 用PHP搞掂黑群晖IPv6的DNSPod解析【7月23日更新,支持v4和v6】
  16. 苹果手机又刷屏啦!!它是如何做到的?
  17. 回音消除--富迪科技
  18. 简单体验阿里巴巴在线java诊断工具Arthas
  19. 深度!推动“企业上云”光有补贴不够,还要看这5点
  20. 电子竞技——靠智力取胜的体育项目

热门文章

  1. SAP Spartacus的全局配置
  2. 蛙泳如何找准背部发力的感觉
  3. Groovy里的运行时元数据编程(metata programming)
  4. CL_FXS_URL_DATA_FETCHER - a good utility to fetch picture binary data according to url
  5. SAP UI5里的abap.js
  6. connect SAP Hybris Enterprise Commerce Platform to SAP Kyma
  7. Marketing Cloud profile界面功能介绍
  8. 为什么CRM WebClient UI每次点了回车都会触发到后台的roundtrip
  9. 如何查看其他人的ABAP authorization check log
  10. How to resolve ATC error message Package Violation (Error) - Missing Use Access (USEM)