Python子进程通信挂起

时间:2016-12-14 14:59:32

标签: python windows subprocess communicate

我知道这是一个经常被问到的问题,我尝试过任何解决方法,我可以在这里和其他网站找到^但无法解决我的问题。 我的困境如下(在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结合起来,但它没有效果。

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

1 个答案:

答案 0 :(得分:2)

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = super.onCreateView(inflater, container, savedInstanceState); ViewGroup vg = (ViewGroup) v.findViewById(R.id.fragment_holder) inflater.inflate(R.layout.fragment_lans, vg, true); MyFragment.ApiCallJob apicalljob = new MyFragment.ApiCallJob(); showLoader(); apicalljob.execute("a string"); return v; } 没有任何关系。

您在本地将subprocess更改为done。您必须全局定义它才能正确退出。

True