我正在使用子进程模块启动子进程并连接到它的输出流(stdout).我希望能够在其标准输出上执行非阻塞读取.有没有办法让.readline非阻塞或在我调用之前检查流上是否有数据.readline
?我希望这是可移植的,或至少在Windows和Linux下工作.
这是我现在如何做到的(.readline
如果没有数据可用,则阻止它):
p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE)
output_str = p.stdout.readline()
Run Code Online (Sandbox Code Playgroud) 我有一个脚本,我想在python(2.6.5)中运行,遵循以下逻辑:
最后一个提示行包含我需要解析的文本(filename.txt).提供的响应无关紧要(只要我可以解析该行,程序实际上可以在不提供响应的情况下退出)
我的要求有点类似于在python脚本中包装交互式命令行应用程序,但是那里的响应看起来有点令人困惑,即使OP提到它不适合他,我仍然会挂起.
通过环顾四周,我得出的结论subprocess
是这样做的最佳方式,但我遇到了一些问题.这是我的Popen系列:
p = subprocess.Popen("cmd", shell=True, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, stdin=subprocess.PIPE)
Run Code Online (Sandbox Code Playgroud)
当我打电话给read()
或readline()
打开时stdout
,提示是打印机到屏幕并挂起.
如果我叫write("password\n")
了stdin
,提示被写入屏幕,它挂起.write()
未写入文本(我没有光标移动新行).
如果我调用p.communicate("password\n")
,与write()相同的行为
我在这里寻找一些关于输入的最佳方式的想法,stdin
如果你感觉很慷慨,可能如何解析输出中的最后一行,尽管我最终可能会想到这一点.