当前位置: 首页 > 面试题库 >

如何从subprocess.Popen.stdout(非阻塞)读取所有可用数据?

姜嘉荣
2023-03-14
问题内容

我需要一种方法来读取Popen创建的流中所有当前可用的字符,或者找出缓冲区中还剩下多少个字符。

背景:我想用Python远程控制一个交互式应用程序。到目前为止,我已经使用Popen创建了一个新的子html" target="_blank">进程:

process=subprocess.Popen(["python"],shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE, cwd=workingDir)

(我并不是真正开始使用python,但是实际的交互界面是相似的。)此刻,我读取了1个字节,直到检测到进程已到达命令提示符:

output = ""
while output[-6:]!="SCIP> ":
    output += process.stdout.read(1)
    sys.stdout.write(output[-1])
return output

然后,我通过进行冗长的计算process.stdin.write("command\n")。我的问题是,由于无法检查流中的最后一个字符是否是提示,因此无法检查计算是否已完成。read()read(n)阻塞我的线程,直到到达EOF(永远不会),因为交互式程序直到被告知后才会结束。以上述循环的方式查找提示也不起作用,因为提示只会在计算之后出现。

理想的解决方案是让我从流中读取所有可用字符,如果没有要读取的内容,则立即返回空字符串。


问题答案:

随便看看,我发现这个非常好的解决方案

持久python子进程

通过使用fcntl将子进程管道上的文件属性设置为非阻塞模式,从而避免了阻塞问题,不需要辅助线程或轮询。我可能会丢失一些东西,但是它解决了我的交互式过程控制问题。



 类似资料:
  • 问题内容: 我有这段代码可以在Linux中从Serial读取,但是我不知道在读取SerialPort时阻塞和非阻塞之间有什么区别,在哪种情况下哪个更好? 问题答案: 您提到的代码是IMO编码和注释不当的代码。该代码不符合POSIX的可移植性惯例,如正确设置终端模式和POSIX操作系统的串行编程指南中所述。该代码没有提到它使用非规范(也称为原始)模式,并且重用了“阻塞”和“非阻塞”术语来描述 VMI

  • 问题内容: Java中是否有非阻塞文件读取API?如果不是,在C ++中构建一个并通过JNI从Java应用程序中调用它是否明智? 问题答案: 不,不扩展。 可能是因为并非所有的操作系​​统都支持它。 Windows确实如此,从理论上讲,您可以编写Windows特定的C ++库,并通过JNI进行调用,但是将其与集成是很多工作。 我宁愿有一个工作线程将文件内容复制到管道中,并在管道的另一端进行非阻塞读

  • 问题内容: 我需要使用逐行读取文件,但是没有像一次读取一个完整行的方法。有什么解决方案? 问题答案: NIO通常用于直接内存访问或块介导的批量数据传输。它可以做其他事情,但是其他功能与阻塞和非阻塞数据访问有更多关系。 因此,您可能想使用NIO来快速(或以非阻塞方式)获取数据。但是,如果要“逐行读取”,最好在NIO读取可用数据后进行行检测。可以通过在NIO刚刚读取的缓冲区上放置“行读取”外观来轻松实

  • 问题内容: 我正在尝试在Go中创建服务器和客户端,我已经设法与服务器和客户端进行通信。但是我的问题是,在golang中读取的TCP是非阻塞的。我想知道的是,golang中的读取是否有可能像C中的读取一样被阻塞。谢谢 编辑: 这是服务器的源代码: 和我的客户: 问题答案: 可以返回部分数据。从该文档,“如果某些数据是可用的,但不是LEN(P)个字节,读取常规返回什么是可用的,而不是等待更多。” 无论

  • 当我运行这段代码并且调用图确实很大时,程序会打印到输出的最后一行,并在处被阻塞,尽管没有任何剩余内容。有人知道问题出在哪里吗?将调用图发送到错误流。我尝试执行,这样我就可以从文件中读取,但它抱怨有太多的位置参数。 奇怪的是,对于小尺寸的调用图,代码运行得很好。

  • 问题内容: 我正在为比赛设计一个机器人,该机器人通过接收机器人的输入并使用Python的输出。我有以下内容: 问题在于输入是通过流输入的,并且使用上述输入,使我无法打印任何内容,直到关闭流。我该怎么做才能使这项工作? 问题答案: 通过关闭屏蔽功能,您一次只能读取一个字符。因此,无法在非阻塞上下文中工作。我假设您只是想阅读按键来控制机器人。 我在Linux上没有运气,并创建了一种调整设置的方法。因此