2013-10-21 47 views
0

我有一个subprocess.call()的问题,它不等待从线程内部调用时。subprocess.call()不要等待从线程调用

这里是我正在使用的代码:

import time 
from PyQt4 import QtCore, QtGui 
import sys 
import subprocess 


def tt_fun(): 
    for a in range(1, 200): 
     print a 
##  time.sleep(0.13) 
     subprocess.call("timeout 1000") 

class SleepProgress(QtCore.QThread): 
    procDone = QtCore.pyqtSignal(bool) 
    partDone = QtCore.pyqtSignal(int) 

    func = None 

    def write(self, txt): 

     if txt != '': 
      try: 
       self.partDone.emit(int(txt[:-1])) 
      except:pass 
    def run(self): 
     self.func() 
     self.procDone.emit(True) 


class AddProgresWin(QtGui.QWidget): 
    def __init__(self, func , parent=None): 
     super(AddProgresWin, self).__init__(parent) 

     sp =SleepProgress() 
     self.thread = sp 
     sys.stdout=sp 
     self.nameLabel = QtGui.QLabel("0.0%") 
     self.nameLine = QtGui.QLineEdit() 

     self.progressbar = QtGui.QProgressBar() 
     self.progressbar.setMinimum(1) 
     self.progressbar.setMaximum(100) 

     mainLayout = QtGui.QGridLayout() 
     mainLayout.addWidget(self.progressbar, 0, 0) 
     mainLayout.addWidget(self.nameLabel, 0, 1) 

     self.setLayout(mainLayout) 
     self.setWindowTitle("Processing") 
     self.thread.func =func 
     self.thread.partDone.connect(self.updatePBar) 
     self.thread.procDone.connect(self.fin) 

     self.thread.start() 

    def updatePBar(self, val): 
     self.progressbar.setValue(val) 
     perct = "{0}%".format(val) 
     self.nameLabel.setText(perct) 

    def fin(self): 
     pass 


if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.path) 
    pbarwin = AddProgresWin(tt_fun) 
    pbarwin.show() 
    sys.exit(app.exec_()) 
+0

您预期会发生什么,而发生了什么呢?另外,你确定你确实在运行任何东西?你只是使用调用而不检查返回值。 – abarnert

+0

这段代码显示了一个进度条,我已经把timeout设置为延迟progrssbar值的每次更改,但是这个“超时”似乎被忽略了。所以线程不会等待超时完成 – geogeek

回答

2

subprocess.call("timeout 1000")失败,“没有这样的文件或目录”。您或者需要通过shell subprocess.call("timeout 1000", shell=True)运行此程序或将程序和参数作为列表subprocess.call(["timeout", " 1000"])传递。第二个选项会快一点。

它是一个好主意,记录线程中的错误,所以你知道发生了什么!

def tt_fun(): 
    try: 
     for a in range(1, 200): 
      print a 
##   time.sleep(0.13) 
      retval = subprocess.check_call("timeout 1000") 
    except Exception, e: 
     sys.stderr.write("tt_fun error %s\n" % e) 
     raise 
+0

使用'check_call'而不是'call'和'assert' retval可能会更简单。除了更短,它意味着你得到一个有意义的异常类型而不是'AssertionError'。 – abarnert

+0

@abarnet - 是的,你是对的。我试图强调需要返回代码检查,但这是一个更好的方法。 – tdelaney