- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当 p.stdout.read(-1) 被阻塞时-6ren"> 当 p.stdout.read(-1) 被阻塞时-你好,我对 Python 子进程模块有疑问 我想与子进程交互(例如:子进程的标准输入、标准输出) 这是子程序的代码 1 #include 2 3 int main(){ 4 -6ren">
当 p.stdout.read(-1) 被阻塞时
你好,我对 Python 子进程模块有疑问
我想与子进程交互(例如:子进程的标准输入、标准输出)
这是子程序的代码
1 #include <stdio.h>
2
3 int main(){
4 char buf[1024];
5 printf("asdfsadfasff\n");
6 scanf("%s",buf);
7 printf("%s\n",buf);
8 }
这段代码很简单,打印字符串,等待输入,打印输入字符串
接下来是python代码
1 #!/usr/bin/python
2 from subprocess import *
3
4 fd = Popen(["./random"],stdin=PIPE,stdout=PIPE)
5 print "pid = %d"%(fd.pid) # print pid
6 result = ""
7 result = fd.stdout.read(-1) # read
8 print result
9 fd.stdin.write("write write write!!!\n")
10 result = fd.stdout.read(-1)
11 print result
在这种情况下,我预计这个程序会运行良好,但在第 7 行(fd.stdout.read(-1) 被阻塞并且无法运行
我更改了读取函数的参数 (read(-1), read(1), read(), read(1024)) 但一切都不起作用
但是,当我首先在 stdin 中输入字符串时,程序运行正常。
我认为当程序结束时 child 的标准输出缓冲区没有被填充...这只是我的选择
这个问题有解决办法吗?
编辑1。当我首先执行打印字符串的程序,并等待用户输入如“sudo su”效果很好,符合我的预期
我不明白为什么这个案例运作良好
1 from subprocess import *
2
3 fd = Popen(["sudo","su"],stdin=PIPE,stdout=PIPE)
4
5 print fd.stdout.read(-1)
6 print fd.stdin.write("asdfasdfas\n")
最佳答案
子进程 ./random
使用 stdio
,当进程的标准输出不是 tty 设备时,它默认执行“全缓冲”而不是“行缓冲” .由于 python 通过管道(不是 tty 设备)运行进程,程序正在缓冲其输出,而不是在 scanf
调用时打印它。缓冲区仅在 (a) 填满时刷新(写入标准输出); (b) 当使用 fflush
调用显式刷新时;或 (c) 在程序退出时。
您可以修改子进程以执行显式 fflush
调用,或者您可以使用来自 Python 的伪 tty,例如 pexpect
或 sh
. (请注意,sh
模块默认使用 pty 仅用于输出,但这通常就足够了。)或者,在这种情况下,您正在运行的程序只是“看起来是交互式的”(但实际上是完全可预测),您可以使用预先提供的已知输入序列运行它:
fd = Popen(["./random"], stdin=PIPE, stdout=PIPE)
result = fd.communicate("write write write!!!\n")[0]
尽管如此,您当然会将所有标准输出输入混合在一起,并且必须将它打印的两行分开(在这种特殊情况下)。
关于Python <p = Popen( ["command"), stdout=PIPE)> 当 p.stdout.read(-1) 被阻塞时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10607211/
我有管道输出 command_a | command_b | ... | command_n 输出是一个数字序列 4.2 -1 ... 0.2 我可以使用 gnuplot 绘制这些数字吗? (将 gn
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 6 年前。 Improv
我目前正在尝试连接父项和子项之间的管道。子级正在执行 sort 并对从父级接收到的输入进行排序。然后 children 写入一个单独的管道。每个进程有两个管道。一个这样 parent 可以将输入发送给
最近我正在研究 Python 中的并行编程工具。这是 os.pipe 和 multiprocessing.Pipe 之间的两个主要区别。(尽管它们被使用的场合) os.pipe是单向,multipro
我的站点上运行着 Yahoo Pipe,Romneyomics它使用来自 Delicious 和 Topsy 的饲料。Delicious 提要不提供“描述”字段,但 Topsy 提供,并且不仅仅是一个
我有一些使用管道的 Haskell 代码: module Main(main) where import Pipes a :: Producer Int IO () a = each [1..10]
所以标题几乎解释了我的问题。 stdout=subprocess.PIPE 和 stdout=PIPE 有什么区别?两者都来自 subprocess 模块,但为什么要使用一个而不是另一个呢?你如何使用
我有一个名为“myPipe”的自定义管道。我得到: The pipe 'myPipe' could not be found error 在我的单元测试中请建议在我的 .spec.ts 中导入和声明什
我有一个非常简单的 Python 3 脚本: f1 = open('a.txt', 'r') print(f1.readlines()) f2 = open('b.txt', 'r') print(f
我正在使用管道和 Python 的多处理模块在进程之间发送简单的对象。文档指出,如果管道已关闭,则调用 pipe.recv() 应该引发 EOFError。相反,我的程序只是阻塞在 recv() 上,
我在 perl 中见过这两种形式的管道 open。 一种是简单的管道打开 open FH,'| command'; 其他是安全管道打开 open FH,'|-','command'; 现在,第二个中的
我正在尝试对我的组件进行单元测试,但它立即生成一个错误: 类型错误:this.store$.pipe 不是函数 根据我的理解, createSpyObj 应该模拟状态。我有不同的选项选项,但没有一个起
我在这里看到这个帖子很多次了;但未能从命令中捕获故意错误。迄今为止我找到的最好的部分工作.. from Tkinter import * import os import Image, ImageTk
我正在编写一个简单的程序来解析编译器的输出并重新格式化任何错误消息,以便我们使用的 IDE(visual studio)可以解析它们。我们使用 nmake构建,它将使用如下命令行调用编译器: cc16
我有一个在coreos上运行的kubernetes集群。我希望在称为记录的Pod中的容器中运行journal2gelf https://github.com/systemd/journal2gelf。
为什么当管道中没有写入器时,读取器存在可以,但当管道中没有读取器时,写入器存在就不行? 。是不是因为reader需要等待,所以没有writer也没关系,而writer已经准备好数据了,即使数据准备好了
我在/etc/postfix/master.cf 中创建了一个 postfix 命令管道,其中包含一个在 STDOUT 和 STDERR 上产生输出的有效命令。在终端上调用时一切正常(因此在 STDO
我有一个命令需要来自管道的输入。例如,考虑著名的 cat 命令: $ echo Hello | cat Hello 假设我在 Perl 6 程序中有一个字符串,我想将其通过管道传递给命令: use v
因此,由于我们拥有各种设置,我习惯于遇到需要将一个可观察结果添加到另一个结果的地方,然后同时使用两者。我需要第一个在另一个之前完成的地方 getUser() .pipe( mergeMap
我在 Angular 5 中有一个非常简单的管道 import { Pipe, Injectable } from '@angular/core'; @Pipe({ name: "defaul
我是一名优秀的程序员,十分优秀!