python - 如何使用 subprocess.POPEN 获取异步输入和输出

标签 python multithreading subprocess popen communicate

我已经为此工作了几个小时,但一直未能想出一个好的解决方案。一些背景知识,我正在运行一个密码破解程序,该程序从命令行关闭源代码,但当我的 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/

相关文章:

python - 使用子进程在 Python 中执行命令行?

python - TCP 服务器正在关闭连接

python - 在多索引数据框中填充缺失的时间值

python - 无法绘制图表

java - 如何在不使用 InheritableThreadLocal 的情况下为每个顶级进程/线程提供共享上下文?

python - 使用 argparse 将参数发送到 Python 脚本中的函数

python - 比较给定精度的十进制数

multithreading - Ubuntu 和 pthreads 上的 CPU 软锁定

python - 为什么我的 PyQt 代码在多线程时不能完全执行?

python - 如何使用可读的非阻塞输出管道在 linux 上的 python 中启动 node.js 子进程