您不需要在示例中使用process.communicate。在

只需使用process.stdin.write和process.stdout.read进行读写。还要确保发送一个新行,否则read不会返回。当您从stdin读取时,还必须处理来自echo的新行。在

注意:process.stdout.read将阻塞,直到EOF。在# talk_with_example_input.py

import subprocess

process = subprocess.Popen(["./exampleInput.sh"],

stdin = subprocess.PIPE,

stdout = subprocess.PIPE)

process.stdin.write("5\n")

stdout = process.stdout.readline()

print(stdout)

if stdout == "25\n":

process.stdin.write("yes\n")

print(process.stdout.readline())

^{pr2}$

更新

以这种方式与程序通信时,必须特别注意应用程序实际编写的内容。最好是在十六进制编辑器中分析输出:$ chimera nogui 2>&1 | hexdump -C

请注意,readline[1]只读取下一个换行符(\n)。在您的例子中,您必须至少调用readline四次才能得到第一块输出。在

如果您只想在子进程停止打印之前读取所有内容,则必须逐字节读取并实现超时。遗憾的是,read和{}都没有提供这种超时机制。这可能是因为底层的readsyscall[2](Linux)也没有提供一个。在

在Linux上,我们可以使用poll / select编写单线程read_with_timeout()。有关示例,请参见[3]。在from select import epoll, EPOLLIN

def read_with_timeout(fd, timeout__s):

"""Reads from fd until there is no new data for at least timeout__s seconds.

This only works on linux > 2.5.44.

"""

buf = []

e = epoll()

e.register(fd, EPOLLIN)

while True:

ret = e.poll(timeout__s)

if not ret or ret[0][1] is not EPOLLIN:

break

buf.append(

fd.read(1)

)

return ''.join(buf)

如果您需要一种可靠的方法来读取Windows和Linux下的非阻塞,this answer might be helpful。在readline(limit=-1)

Read and return one line from the stream. If limit is specified, at most limit bytes will be read.

The line terminator is always b'\n' for binary files; for text files, the newline argument to open() can be used to select the line terminator(s) recognized.

[2]来自man 2 read:#include

ssize_t read(int fd, void *buf, size_t count);

[3]示例$ tree

.

├── prog.py

└── prog.sh

在程序sh在#!/usr/bin/env bash

for i in $(seq 3); do

echo "${RANDOM}"

sleep 1

done

sleep 3

echo "${RANDOM}"

在进度计划在# talk_with_example_input.py

import subprocess

from select import epoll, EPOLLIN

def read_with_timeout(fd, timeout__s):

"""Reads from f until there is no new data for at least timeout__s seconds.

This only works on linux > 2.5.44.

"""

buf = []

e = epoll()

e.register(fd, EPOLLIN)

while True:

ret = e.poll(timeout__s)

if not ret or ret[0][1] is not EPOLLIN:

break

buf.append(

fd.read(1)

)

return ''.join(buf)

process = subprocess.Popen(

["./prog.sh"],

stdin = subprocess.PIPE,

stdout = subprocess.PIPE

)

print(read_with_timeout(process.stdout, 1.5))

print(' -')

print(read_with_timeout(process.stdout, 3))$ python2 prog.py

6194

14508

11293

-

10506

python stdin stdout_Python子进程:给出stdin,读取stdout,然后给出更多stdin相关推荐

  1. layer 弹出层读取html,Layer弹出层动态获取数据的方法

    前一阵子做了一个简单的小项目,用到了layer弹出层(弹出层的用法就不多加赘述了,官网上都有详细的介绍,这里附上网址),当时前后台合页面的时候就出现了一个问题,弹出层总是获取不到数据,不过后面还是和同 ...

  2. python进程池(子进程)函数没有执行

    文章目录 1. 问题描述 问题排查经过 关于此问题的两个可能原因 内容较长 1. 问题描述 某日,写了一段爬虫代码(如下,爬取糗百图片代码示例),发现一个异常的问题,就是执行代码时,代码会以极快的速度 ...

  3. python按行读字符串,python按行读取文件并找出其中指定字符串

    python怎么提取出文件里的指定内容 python读取文件内容的方法: 一.最方便的方法是一次性读取文件中的所有内容并放置到一个大字符串中: all_the_text = open('thefile ...

  4. Python文件内容读取成绩单,计算出平均分并且写入原文件存储

    python文件内容读取成绩单,计算出平均分并且写入原文件存储 文件内容如下:( 格式参考下表, 内容自己定义) 姓名 语文 数学 英语 aaa 80 70 65 bbb 85 88 90 ccc 7 ...

  5. 在Python中对子进程进行非阻塞读取

    我正在使用子流程模块来启动子流程并连接到其输出流(stdout). 我希望能够在其stdout上执行非阻塞读取. 有没有一种方法可以使.readline成为非阻塞状态,或者在调用.readline之前 ...

  6. Python的subprocess子进程和管道进行交互

    在很久以前,我写了一个系列,Python和C和C++的交互,如下 http://blog.csdn.net/marising/archive/2008/08/28/2845339.aspx 目的是解决 ...

  7. 子进程无法从标准输入读取数据

    每个process对象最多只能调用一次start()方法,join([timeout])方法会阻塞调用process对象的进程,直到timeout时间超时,或者process进程退出.如果timeou ...

  8. Python实战之子进程

    Python实战之子进程 最近做一个小工具需要用到Python的字进程,看了一下Python的API,subprocess模块可以就可以实现,并且还挺简单 要实现一个简单的自进程,只需要 [pytho ...

  9. python popen阻塞_对Python subprocess.Popen子进程管道阻塞详解

    问题产生描述 使用子进程处理一个大的日志文件,并对文件进行分析查询,需要等待子进程执行的输出结果,进行下一步处理. 出问题的代码 # 启用子进程执行外部shell命令 def __subprocess ...

  10. livechart 只显示 y 值_基于Python语言的SEGY格式地震数据读取与显示编程

    敬请关注<地学新视野> 摘要:本文简单介绍了SEG-Y地震数据文件格式,以及如何用Python语言编写读写SEG-Y格式的地震数据并绘制地震剖面,其中用到了Segyio和matplotli ...

最新文章

  1. Redis 笔记(10)— 发布订阅模式(发布订阅单个信道、订阅信道后的返回值分类、发布订阅多个信道)
  2. 每日一皮:新年好...
  3. AseoZdpAseo.init(this, AseoZdpAseo.INSERT_TYPE);
  4. 刚刚,阿里云知行动手实验室正式开放公测了
  5. 苏宁大战京东,这个618消费者终于薅到了真羊毛?
  6. Java知多少(2)虚拟机(JVM)以及跨平台原理
  7. java 并发包_Java常用并发包
  8. Teechart图表教程:Teechart的组成
  9. imx6 android 最新,【iMX6Q-Android6.0】---移植 iMX6Q android6.0 源码 史上最详细
  10. 关于flash跨域问题
  11. 关于CalendarUtil获取时间的工具类
  12. 寂寞情来情去——忆纳兰词
  13. SAP 未审批的采购订单(PO)提交到OA去审批,最后OA审批结果回写到SAP。
  14. 公众号 接收规则 消息_微信公众号教程(11)公众账号接收非文字消息 上
  15. Go语言核心之美 2.4-布尔值
  16. 凛冬至,这一杯互联网咖啡能热多久?
  17. WinSCP(5.11.2)绿色便携版,开源SCP/SFTP客户端
  18. BZOJ 3729: Gty的游戏
  19. 根据银行卡获取发卡行信息
  20. 许单单奋斗记:从小职员到美基金公司分析师

热门文章

  1. 内存模型系列(下)- 内存持久性模型(Memory Persistency)
  2. 使用application记录页面访问次数
  3. 织梦(dedecms)标签大全(非常全面)
  4. 通过easyx窗口实现贪吃蛇
  5. thx是什么意思_thx是什么意思?
  6. Birdman Quotes
  7. oracle order siblings by,sql中ORDER SIBLINGS BY排序的含义
  8. 深度学习手记(八)之PTB实现LSTM模型
  9. Manjaro学习笔记
  10. 为什么我说低代码是“行业毒瘤”?