Python子进程通信挂起

Python子进程通信挂起,python,windows,subprocess,communicate,Python,Windows,Subprocess,Communicate,我知道这是一个经常被问到的问题,我尝试过任何我在这里和其他网站上能找到的解决方法,但都不能解决我的问题。 我的困境如下(在Windows上): 我有一个主脚本(main.py),通过Popen调用另一个脚本(sniffer.py)创建一个子流程。之后,我在main.py中做了一些工作,最后希望向子流程发送一个字符,以完成sniffer.py中的无休止循环,最后完成整个子流程 main.py process = Popen(["python", "sniffer.py", receiverIP,

我知道这是一个经常被问到的问题,我尝试过任何我在这里和其他网站上能找到的解决方法,但都不能解决我的问题。 我的困境如下(在Windows上):

我有一个主脚本(main.py),通过Popen调用另一个脚本(sniffer.py)创建一个子流程。之后,我在main.py中做了一些工作,最后希望向子流程发送一个字符,以完成sniffer.py中的无休止循环,最后完成整个子流程

main.py

process = Popen(["python", "sniffer.py", receiverIP, senderIP, "udp", path],stdin=PIPE)
#do some stuff
process.communicate('terminate')
sniffer.py

def check(done):
    while True:
        if sys.stdin.read() == 'terminate':
            done = True
            break
def sniff(someparams):
    done = False
    input_thread = threading.Thread(target=check, args=(done,))
    input_thread.daemon = True
    input_thread.start()
    while True:
        #do some stuff
        if done:
            break
我还尝试将communicate调用与stdin.write结合起来,但没有效果


注意:我注意到,sniffer.py中的while循环在我的communicate()调用之后不会继续(整个脚本只是挂起)

子流程无关

您可以在本地将
done
更改为
True
。您必须全局定义它,以便最后一个循环正确退出

done = False

def check():
    global done
    while True:
        if sys.stdin.read() == 'terminate':
            done = True
            break
def sniff(someparams):
    global done
    done = False
    input_thread = threading.Thread(target=check)
    input_thread.daemon = True
    input_thread.start()
    while True:
        #do some stuff
        if done:
            break

子流程
无关

您可以在本地将
done
更改为
True
。您必须全局定义它,以便最后一个循环正确退出

done = False

def check():
    global done
    while True:
        if sys.stdin.read() == 'terminate':
            done = True
            break
def sniff(someparams):
    global done
    done = False
    input_thread = threading.Thread(target=check)
    input_thread.daemon = True
    input_thread.start()
    while True:
        #do some stuff
        if done:
            break

你能具体说明它“不起作用”的具体程度吗?请提供您的输出以帮助调试。我已经编辑了我的问题。您可以指定它“不起作用”的具体程度吗?请提供您的输出以帮助调试。我已经编辑了我的问题。它没有帮助,代码仍然挂在communicate()上。communicate调用正确地将done设置为true,但sniff()中的while循环在此之后挂起尝试在
while true
循环中添加一条print语句,并在该语句之后查看是否已到达。这没有帮助,代码仍然挂起communicate()。communicate调用正确地将done设置为true,但sniff()中的while循环在此之后挂起尝试在
while true
循环中添加一个print语句,并在它之后查看是否达到该语句。