我已经为此工作了几个小时,但一直未能想出一个好的解决方案。一些背景知识,我正在运行一个密码破解程序,该程序从命令行关闭源代码,但当我的 gpu 温度过高时必须不断暂停它。
我用这个程序在 python 中进行其他操作,所以这是我更喜欢的语言。无论如何,密码程序会定期更新它的运行状况、GPU 温度等,并允许我随时暂停它。
我的温度正常,但由于阻塞问题,我猜我无法发送暂停命令。它至少没有做任何事情。我见过几个对输出进行线程处理的示例,但还没有看到使用线程输入和输出而不会导致任何问题的示例。
我的意思是,据我所知,在当前的 POPEN 限制下这可能是不可能的,但希望能得到一些指导。
popen = Popen(command, stdout=PIPE, stdin=PIPE, shell=True)
lines_iterator = iter(popen.stdout.readline, b"")
while 1:
for line in lines_iterator:
cleanLine = line.replace("\n", "")
p = re.compile('[0-9][0-9]c Temp')
m = p.search(cleanLine)
print cleanLine
if m:
temperature = m.group(0)
if int(temperature[:2]) > 80:
overheating = True
print "overheating"
if overheating:
if "[s]tatus [p]ause [r]esume [b]ypass [q]uit" in line:
#It's not doing anything right here, it just continues
print popen.communicate("p")[0]
这是我的代码的要点。它仍然处于 hacky 阶段,所以我知道它可能没有遵循最佳编码实践。
最佳答案
编辑:抱歉,关于过热
的范围,我对最初的回答感到困惑。我删除了答案的第一部分,因为它不再相关。
communicate
将等待进程退出,因此在这种情况下它可能不是您要查找的内容。如果你想让这个过程继续下去
您可以使用类似popen.stdin.write("p")
的方法。如果您的流程需要,您可能还需要发送一个“\n”。
此外,如果您可以接受额外的依赖项,您可能会对 pexpect
感兴趣旨在控制交互过程的模块。
关于python - 如何使用 subprocess.POPEN 获取异步输入和输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33232447/