【问题标题】:Python subprocess communicate hangsPython子进程通信挂起
【发布时间】:2016-12-14 14:59:31
【问题描述】:

我知道这是一个常见问题,我尝试了任何可以在此处和其他网站上找到的解决方案^但无法解决我的问题。 我的困境如下(在 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

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

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

【问题讨论】:

  • 您能否具体说明它“不起作用”的具体程度?请提供您的输出以帮助调试。
  • 我已经编辑了我的问题

标签: python windows subprocess communicate


【解决方案1】:

subprocess无关。

您在本地将 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,但 sniff() 中的 while 循环在此之后挂起
  • 尝试在 while True 循环中添加一个打印语句,然后在它之后查看是否已到达。
猜你喜欢
  • 2012-06-04
  • 2020-06-08
  • 2017-02-28
  • 2012-09-07
  • 2015-07-07
  • 2016-12-02
  • 2013-08-18
  • 1970-01-01
  • 2017-05-13
相关资源
最近更新 更多