在Python线程内运行子进程,实时读取输出

在Python线程内运行子进程,实时读取输出,python,multithreading,process,Python,Multithreading,Process,考虑以下Python代码: import io import time import subprocess import sys from thread import start_new_thread def ping_function(ip): filename = 'file.log' command = ["ping", ip] with io.open(filename, 'wb') as writer, io.open(filename, 'rb', 1

考虑以下Python代码:

import io
import time
import subprocess
import sys

from thread import start_new_thread

def ping_function(ip):

    filename = 'file.log'
    command = ["ping", ip]

    with io.open(filename, 'wb') as writer, io.open(filename, 'rb', 1) as reader:
        process = subprocess.Popen(command, stdout=writer)
        while process.poll() is None:
            line = reader.read()
            # Do something with line
            sys.stdout.write(line)
            time.sleep(0.5)
        # Read the remaining
        sys.stdout.write(reader.read())

ping_function("google.com")
目标是运行shell命令(在本例中为ping,但此处不相关),并实时处理输出,输出也保存在日志文件中

换句话说,ping在后台运行,它每秒在终端上产生输出。我的代码将读取此输出(每0.5秒一次),对其进行解析,并(几乎)实时执行某些操作

这里的Realtime意味着我不想等到进程结束后再读取输出。在这种情况下,实际上,ping永远不会完成,因此我刚才描述的方法是强制性的

我已经测试了上面的代码,它实际上工作正常:)

现在我想在一个单独的线程中对此进行tun,因此我用以下内容替换了最后一行:

from thread import start_new_thread
start_new_thread(ping_function, ("google.com", ))
由于某些原因,这不再有效,并且读取器总是返回空字符串。 特别是,reader.read()返回的字符串总是空的

使用队列或其他全局变量不会有帮助,因为我甚至在一开始检索数据(即获取shell命令的输出)时都会遇到问题

我的问题是:

  • 我如何解释这种行为

  • 在一个单独的线程中运行进程是一个好主意,还是我应该使用另一种方法?表明它不是

  • 如何修复代码


谢谢

启动线程后,不应使用fork。您可以在启动fork之后执行线程,因此您可以使用线程处理I/O管道,但是

让我重复一下:在开始线程之后,您不应该分叉

那篇文章解释得很好。一旦启动线程,您就无法控制程序的状态。尤其是在Python中,在后台进行的事情


要修复代码,只需从主线程启动子进程,然后启动线程。在线程中处理来自管道的I/O完全可以。

这非常有意义。谢谢你的回答