python stdin stdout_Python子进程:给出stdin,读取stdout,然后给出更多stdin
您不需要在示例中使用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相关推荐
- layer 弹出层读取html,Layer弹出层动态获取数据的方法
前一阵子做了一个简单的小项目,用到了layer弹出层(弹出层的用法就不多加赘述了,官网上都有详细的介绍,这里附上网址),当时前后台合页面的时候就出现了一个问题,弹出层总是获取不到数据,不过后面还是和同 ...
- python进程池(子进程)函数没有执行
文章目录 1. 问题描述 问题排查经过 关于此问题的两个可能原因 内容较长 1. 问题描述 某日,写了一段爬虫代码(如下,爬取糗百图片代码示例),发现一个异常的问题,就是执行代码时,代码会以极快的速度 ...
- python按行读字符串,python按行读取文件并找出其中指定字符串
python怎么提取出文件里的指定内容 python读取文件内容的方法: 一.最方便的方法是一次性读取文件中的所有内容并放置到一个大字符串中: all_the_text = open('thefile ...
- Python文件内容读取成绩单,计算出平均分并且写入原文件存储
python文件内容读取成绩单,计算出平均分并且写入原文件存储 文件内容如下:( 格式参考下表, 内容自己定义) 姓名 语文 数学 英语 aaa 80 70 65 bbb 85 88 90 ccc 7 ...
- 在Python中对子进程进行非阻塞读取
我正在使用子流程模块来启动子流程并连接到其输出流(stdout). 我希望能够在其stdout上执行非阻塞读取. 有没有一种方法可以使.readline成为非阻塞状态,或者在调用.readline之前 ...
- Python的subprocess子进程和管道进行交互
在很久以前,我写了一个系列,Python和C和C++的交互,如下 http://blog.csdn.net/marising/archive/2008/08/28/2845339.aspx 目的是解决 ...
- 子进程无法从标准输入读取数据
每个process对象最多只能调用一次start()方法,join([timeout])方法会阻塞调用process对象的进程,直到timeout时间超时,或者process进程退出.如果timeou ...
- Python实战之子进程
Python实战之子进程 最近做一个小工具需要用到Python的字进程,看了一下Python的API,subprocess模块可以就可以实现,并且还挺简单 要实现一个简单的自进程,只需要 [pytho ...
- python popen阻塞_对Python subprocess.Popen子进程管道阻塞详解
问题产生描述 使用子进程处理一个大的日志文件,并对文件进行分析查询,需要等待子进程执行的输出结果,进行下一步处理. 出问题的代码 # 启用子进程执行外部shell命令 def __subprocess ...
- livechart 只显示 y 值_基于Python语言的SEGY格式地震数据读取与显示编程
敬请关注<地学新视野> 摘要:本文简单介绍了SEG-Y地震数据文件格式,以及如何用Python语言编写读写SEG-Y格式的地震数据并绘制地震剖面,其中用到了Segyio和matplotli ...
最新文章
- 怎么查找执行比较慢的sql语句
- xubuntu 19.10安装tensorflow-gpu-2.0(本文很乱,供自己参考)
- 使用GetNextCell或者GetCell输出vtkCellArray的坐标点
- 比可微架构搜索DARTS快10倍,第四范式提出优化NAS算法
- MapReduce: Simplified Data Processing on Large ...
- 奇异值分解(SVD)相关知识
- mui 时间样式错乱_微信公众号素材样式中心在哪?公众号动态分割线怎么添加?...
- 洛谷P2278操作系统
- java中的与或运算
- HDU 5701:中位数计数
- win32实现两个透明窗口联动
- 【2022年玄武云科技AI算法岗秋招面试记录】
- java clh_【Java】CLH 自旋锁
- STM32 解析 JSON 之 cJSON
- 2021年危险化学品经营单位主要负责人试题及解析及危险化学品经营单位主要负责人模拟考试题
- AF monitor tuning <2>
- php-gtk2怎么用,学习php-gtk2之开发环境安装
- html5 metro 手机,方块世界:Metro UI简单看
- 学习 VS2010编程经典示例
- 高德地图点标记及信息窗体的使用