0

我知道这是一个经常被问到的问题,我尝试了任何可以在此处和其他网站上找到的解决方案^但无法解决我的问题。我的困境如下(在 Windows 上):

我有一个主脚本(main.py),我通过 Popen 创建一个子进程调用另一个脚本(sniffer.py)。之后我在 main.py 中做一些事情,最后想向子进程发送一个字符以完成 sniffer.py 中的无限循环,最后是整个子进程。

主文件

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

嗅探器.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

我还尝试将通信调用与 stdin.write 结合起来,但没有效果。

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

4

1 回答 1

2

无关subprocess

你改doneTrue本地。您必须为最后一个循环正确退出全局定义它。

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
于 2016-12-14T15:29:55.753 回答