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 from python_qt_binding.QtCore import QObject, Signal
34 try:
35 from python_qt_binding.QtGui import QMessageBox
36 except:
37 from python_qt_binding.QtWidgets import QMessageBox
38 import subprocess
39 import threading
40
41 from .detailed_msg_box import WarningMessageBox
45 '''
46 The class overrides the subprocess.Popen and waits in a thread for its finish.
47 If an error is printed out, it will be shown in a message dialog.
48 '''
49 error = Signal(str, str, str)
50 '''@ivar: the signal is emitted if error output was detected (id, decription, message)'''
51
52 finished = Signal(str)
53 '''@ivar: the signal is emitted on exit (id)'''
54
55 - def __init__(self, args, bufsize=0, executable=None, stdin=None, stdout=None,
56 stderr=subprocess.PIPE, preexec_fn=None, close_fds=False,
57 shell=False, cwd=None, env=None, universal_newlines=False,
58 startupinfo=None, creationflags=0, object_id='', description=''):
59 '''
60 For arguments see https://docs.python.org/2/library/subprocess.html
61 Additional arguments:
62 :param object_id: the identification string of this object and title of the
63 error message dialog
64 :type object_id: str
65 :param description: the description string used as addiotional information
66 in dialog if an error was occured
67 :type description: str
68 '''
69 try:
70 QObject.__init__(self)
71 self._args = args
72 self._object_id = object_id
73 self._description = description
74 self.error.connect(self.on_error)
75
76 self.popen = subprocess.Popen(args=args, bufsize=bufsize, executable=executable, stdin=stdin, stdout=stdout,
77 stderr=stderr, preexec_fn=preexec_fn, close_fds=close_fds, shell=shell, cwd=cwd, env=env,
78 universal_newlines=universal_newlines, startupinfo=startupinfo, creationflags=creationflags)
79 thread = threading.Thread(target=self._supervise)
80 thread.setDaemon(True)
81 thread.start()
82 except Exception as _:
83 raise
84
85
86
87
88 @property
91
92 @property
95
96 @property
98 return self.popen.stdin
99
101 '''
102 Wait for process to avoid 'defunct' processes
103 '''
104 self.popen.wait()
105 result_err = ''
106 if self.stderr is not None:
107 result_err = self.stderr.read()
108 if result_err:
109 self.error.emit(self._object_id, self._description, result_err)
110 self.finished.emit(self._object_id)
111
112 - def on_error(self, object_id, descr, msg):
113 WarningMessageBox(QMessageBox.Warning, object_id, '%s\n\n'
114 '%s' % (descr, msg), ' '.join(self._args)).exec_()
115