Python子进程通信挂起
我知道这是一个经常被问到的问题,我尝试过任何我在这里和其他网站上能找到的解决方法,但都不能解决我的问题。 我的困境如下(在Windows上): 我有一个主脚本(main.py),通过Popen调用另一个脚本(sniffer.py)创建一个子流程。之后,我在main.py中做了一些工作,最后希望向子流程发送一个字符,以完成sniffer.py中的无休止循环,最后完成整个子流程 main.pyPython子进程通信挂起,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,
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语句,并在它之后查看是否达到该语句。