gpt4 book ai didi

python subprocess - 如何检查 PIPE 中是否没有任何新数据?

转载 作者:太空宇宙 更新时间:2023-11-03 19:19:35 25 4
gpt4 key购买 nike

我有以下示例:

import subprocess

p = subprocess.Popen("cmd",stdin = subprocess.PIPE, stdout=subprocess.PIPE )
p.stdin.write(b'cd\\' + b'\r\n')
p.stdin.write(b'dir' + b'\r\n')
p.stdin.write(b'\r\n')



while True:
line = p.stdout.readline()
print(line.decode('ascii'), end='')
if line.rstrip().decode('ascii') == 'C:\>': #I need to check at this point if there is new data in the PIPE
print('End of File')
break

我正在监听 PIPE 以获取子进程的任何输出,如果没有任何新数据通过 PIPE,我想停止读取。我想要一个控制语句来告诉我 PIPE 是空的。这将帮助我避免出现问题,以防我的进程卡住或以意外结果结束。

最佳答案

除非进程结束或者有一个您希望停止读取的信号,否则没有什么好方法可以提前知道管道中是否有数据,因为命令只有在达到该数字时才会终止您想要读取的字节数 [.read(n)],到达换行符 [.readline()],或到达文件末尾(在进程结束之前该文件不存在)。

但是,您不需要运行 cmd.exe 来运行您的程序,因为您的程序已经在 cmd shell 中运行。

我建议你使用subprocess直接调用程序,并在代码中处理异常/return_code。你可以做类似的事情...

import subprocess
import time

p = subprocess.Popen("your_program.exe",
"-f", "filename",
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)

# If you have to use stdin, do it here.
p.stdin.write('lawl here are my inputs\n')

run_for = 0
while p.poll() == None:
time.sleep(1)
if run_for > 10:
p.kill()
break
run_for += 1

if p.return_code == 0:
...handle success...
else:
...handle failure...

您可以循环执行此操作,并启动一个新进程来运行下一个文件。

如果启动程序的成本(如果不是,那么现在停止阅读,因为它会变得尴尬)那么也许(这完全是一个黑客,但是)在你的过程之后运行了一段时间后,您可以将一个特别奇怪但无害的字符串传递给 p.stdin,如 p.stdin.write("\n~%$%~\n")

如果你能逃脱惩罚,那么你可以做类似的事情......

for line in p.stdout.readlines():
if '~%$%~' in line:
break

但是天哪,请不要这样做。这真是一个黑客。

关于python subprocess - 如何检查 PIPE 中是否没有任何新数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10237291/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com