2017-07-18 65 views
0

這工作:subprocess.Popen的作品,但任何形式的等待(呼叫,等待,溝通)的原因「沒有響應」

def letsExecute(): 
    import subprocess 
    subpr = subprocess.Popen("python " + codeFile + spacedout) 

這將導致程序沒有響應(我在Windows上運行):

def letsExecute(): 
    import subprocess 
    subprocess.call("python " + codeFile + spacedout) 

waitcommunicate基本上任何使主進程等待子進程導致相同。當子進程成功完成時,我希望主進程退出。另外,僅供參考:此功能掛鉤到tkinter Button,並且此程序使用tkinter GUI和mainloop()。不知道,如果這會影響這個問題,但無論如何要讓你知道。

在此先感謝!

回答

1

您的代碼很少出現問題。

subprocess.call()

運行由ARGS中描述的命令。等待命令完成,然後返回返回碼屬性

wait()communicate()也是阻塞功能。

改爲使用poll()

subpr = subprocess.Popen(["python", codeFile, spacedout]) 

while subpr.poll() is None: 
    print("Still working...") 
    time.sleep(0.1) 

由於您希望GUI線程能夠響應,您可以在不同的線程上啓動子進程。這樣的事情,

import subprocess 
import threading 
import time 

def letsExecute(): 
    t = threading.Thread(target=realExec) 
    t.run() 

def realExec(): 
    proc = subprocess.Popen(["python", codeFile, spacedout]) 

    while proc.poll() is None: 
     print("Still working...") 
     time.sleep(0.1) 
1

首先,爲什麼你想subprocess另一個Python腳本時,你可以進口嗎?

無論如何,你的問題的事實,任何callwaitcommunicate等待subprocess如果timeout參數的終止中省略莖。由於這個tkinter應用程序無法自行刷新,因此代碼流無法訪問mainloop

如果你有一些複雜的想法 - 看看threading,multiprocessingthis的話題。

如果你只想終止主處理時,子進程結束 - 在thoose片段看一看:

test.py:

import time 

time.sleep(5) 

爲主。潘岳:

try: 
    import tkinter as tk 
except ImportError: 
    import Tkinter as tk 

import subprocess 

class App(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 

     self.button = tk.Button(self, text='Start', command=self.start_test_process) 
     self.button.pack() 
     self.process = None 

    def continuous_check(self): 
     status = self.process.poll() 

     if status is None: 
      print('busy') 
      self.after(500, self.continuous_check) 
     elif status == 0: 
      print('successfully finished') 
      self.destroy() 
     else: 
      print('something went wrong') 

    def start_test_process(self): 
     self.process = subprocess.Popen('python test.py') 
     self.continuous_check() 


app = App() 
app.mainloop() 

主要思想在這裏保持mainloop可達用的pollafter方法的組合代碼。