1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 import os
34 import sys
35 import subprocess
36 import threading
37 import roslib
38
39 from python_qt_binding import QtCore, QtGui
40
41 import node_manager_fkie as nm
42 from detailed_msg_box import WarningMessageBox, DetailedError
43
44
46 '''
47 The class overrides the subprocess.Popen and waits in a thread for its finish.
48 If an error is printed out, it will be shown in a message dialog.
49 '''
50 error = QtCore.Signal(str, str, str)
51 '''@ivar: the signal is emitted if error output was detected (id, decription, message)'''
52
53 finished = QtCore.Signal(str)
54 '''@ivar: the signal is emitted on exit (id)'''
55
56 - def __init__(self, args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=subprocess.PIPE, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0, id='', description=''):
57 '''
58 For arguments see https://docs.python.org/2/library/subprocess.html
59 Additional arguments:
60 :param id: the identification string of this object and title of the error message dialog
61 :type id: str
62 :param description: the description string used as addiotional information
63 in dialog if an error was occured
64 :type description: str
65 '''
66 try:
67 subprocess.Popen.__init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags)
68 QtCore.QObject.__init__(self)
69 self._args = args
70 self._id = id
71 self._description = description
72 self.error.connect(self.on_error)
73
74 thread = threading.Thread(target=self.supervise)
75 thread.setDaemon(True)
76 thread.start()
77 except Exception as e:
78 raise
79
80
81
82
84
85 self.wait()
86 result_err = ''
87 if not self.stderr is None:
88 result_err = self.stderr.read()
89 if result_err:
90 self.error.emit(self._id, self._description, result_err)
91 self.finished.emit(self._id)
92
94 WarningMessageBox(QtGui.QMessageBox.Warning, id, '%s\n\n%s'%(descr, msg), ' '.join(self._args)).exec_()
95