def build(path): for name in os.listdir(path): source = os.path.join(path, name) target = None if source.endswith(".ui"): target = os.path.join(path, "ui_" + name.replace(".ui", ".py")) command = PYUIC4 elif source.endswith(".qrc"): target = os.path.join(path, name.replace(".qrc", "") + "_rc.py") command = PYRCC4 process = QProcess() if target is not None: if not os.access(target, os.F_OK) or ( os.stat(source)[stat.ST_MTIME] > \ os.stat(target)[stat.ST_MTIME]): if command == PYUIC4 and Execute: args = ["-x", "-o", target, source] else: args = ["-o", target, source] if Debug: print "# %s -o %s %s" % (command, target, source) else: process.start(command, args) if not process.waitForFinished(2 * 60 * 1000): report_failure(command, args, process) else: print source, "->", target elif Verbose: print source, "is up-to-date"
def get_output(cmd): if isinstance(cmd, list): cmd = ' '.join(cmd) process = QProcess() process.start(cmd) process.waitForFinished() return str(process.readAll())
def translate(path): files = [] tsfiles = [] for name in os.listdir(path): if name.endswith((".py", ".pyw")): files.append(os.path.join(path, name)) elif name.endswith(".ts"): tsfiles.append(os.path.join(path, name)) if not tsfiles: return verbose = "-verbose" if Verbose else "" silent = "-silent" if not Verbose else "" process = QProcess() for ts in tsfiles: qm = ts[:-3] + ".qm" command1 = PYLUPDATE4 args1 = [verbose] + files + ["-ts", ts] command2 = LRELEASE args2 = [silent, ts, "-qm", qm] if Debug: print "updated", ts print "generated", qm else: process.start(command1, args1) if not process.waitForFinished(2 * 60 * 1000): report_failure(command1, args1, process) process.start(command2, args2) if not process.waitForFinished(2 * 60 * 1000): report_failure(command2, args2, process)
def main(): app = QApplication(sys.argv) window = QSimpleShellWidget() proc = QProcess() window.setProcess(proc) proc.start('sh -c "while true; do echo foo; sleep 1; done"') window.show() app.exec_()
def testNoArgs(self): '''Connecting a lambda to a signal without arguments''' proc = QProcess() dummy = Dummy() QObject.connect(proc, SIGNAL('started()'), lambda: setattr(dummy, 'called', True)) proc.start(sys.executable, ['-c', '""']) proc.waitForFinished() self.assert_(dummy.called)
def testWithArgs(self): '''Connecting a lambda to a signal with arguments''' proc = QProcess() dummy = Dummy() QObject.connect(proc, SIGNAL('finished(int)'), lambda x: setattr(dummy, 'called', x)) proc.start(sys.executable, ['-c', '""']) proc.waitForFinished() self.assertEqual(dummy.called, proc.exitCode())
def generate_completes(force=False): # check parsed functions cache_file = vex_settings.get_autocomplete_cache_file() if os.path.exists(cache_file) and not force: return True # get vcc vcc = os.path.join(hou.getenv('HFS'), 'bin', 'vcc').replace('/','\\') if os.name == 'nt': vcc = vcc + '.exe' if not os.path.exists(vcc): return False # generate new funcs = {} attrs = {} process = QProcess() process.start(' '.join([vcc, '-X'])) process.waitForFinished() lines = str(process.readAll()).split('\n') for context in lines: if context: process.start(' '.join([vcc, '-X', context])) process.waitForFinished() context_lines = str(process.readAll()) # variables variables = re.search(r'Global Variables:(.*)Control Statements:', context_lines, re.DOTALL) if variables: lines = variables.group(1).strip().split('\n') for l in lines: s = l.split() if len(s)==3: attrs[s[-1]] = s[-2] # functions pat = r'^\s*(\w+\[?\]?)\s(\w+)(\(.+\))' for l in context_lines.split('\n'): func = re.findall(pat, str(l)) if func: f_name = func[0][1] f_args = func[0][2] if f_name in funcs: if not f_args in funcs[f_name].get('args', []): funcs[f_name]['args'].append(f_args) else: funcs[f_name] = {'args': [f_args]} # parse help if Houdini 15 if hou.applicationVersion()[0] >= 15: funcs = parse_help(funcs) # save to cache if os.path.exists(cache_file): comp = json.load(open(cache_file)) else: comp = {} comp['functions'] = funcs comp['attributes'] = attrs json.dump(comp, open(cache_file, 'w')) return True
def run(self): self.logger.debug("patcher started") for patch in self.patches: mod = patch["mod"] fromFile = patch["patchfile"] toFile = patch["tofilename"] frommd5 = patch["md5"] tomd5 = patch["tomd5"] curPatchGen = "%s-%s.xdelta" % (fromFile, toFile) self.logger.debug(curPatchGen) self.logger.debug("opening database") self.db = QtSql.QSqlDatabase.cloneDatabase(self.parentDb, curPatchGen) source = os.path.join( config['global']['content_path'] + r"updaterNew/", mod, fromFile) target = os.path.join( config['global']['content_path'] + r"updaterNew/", mod, toFile) self.logger.debug(source) self.logger.debug(target) patchdest = os.path.join( config['global']['content_path'] + r"xdelta/", curPatchGen) self.logger.debug(patchdest) if os.path.exists(source) and os.path.exists(target): executable = "python" arguments = [ config['global']['install_path'] + "patcher.py", source, target, patchdest ] self.logger.debug(arguments) process = QProcess() process.start(executable, arguments) if not process.waitForFinished(28800000): return self.db.open() query = QSqlQuery(self.db) queryStr = ( "INSERT INTO patchs_table (fromMd5, toMd5, patchFile) VALUES ('%s','%s','%s')" ) % (frommd5, tomd5, curPatchGen) query.exec_(queryStr) # self.db.close()
def process(self, command): # print "process" content = "content" process = QProcess() process.start(command) process.closeWriteChannel() process.waitForFinished() # process.closeWriteChannel() content = process.readAllStandardOutput() print "Content: " + content return unicode(content)
def process(self,command): # print "process" content = "content" process = QProcess() process.start(command) process.closeWriteChannel() process.waitForFinished() # process.closeWriteChannel() content = process.readAllStandardOutput() print "Content: " + content return unicode(content);
def start(self, messageElement): Stream.clear_streams() process = QProcess() self.process = process self.messageElement = messageElement process.setProcessChannelMode(QProcess.MergedChannels) process.start('livestreamer', self.arguments) process.readyReadStandardOutput.connect(self.show_messages) Stream.ALL_STREAMS.append(self)
def start(self, messageElement): Stream.clear_streams() process = QProcess() self.process = process self.messageElement = messageElement process.setProcessChannelMode(QProcess.MergedChannels) process.start("livestreamer", self.arguments) process.readyReadStandardOutput.connect(self.show_messages) Stream.ALL_STREAMS.append(self)
def generate_completes(force=False): # check parsed functions cache_file = vex_settings.get_autocomplete_cache_file() if os.path.exists(cache_file) and not force: return True # get vcc vcc = os.path.join(hou.getenv('HFS'), 'bin', 'vcc').replace('/','\\') if os.name == 'nt': vcc = vcc + '.exe' if not os.path.exists(vcc): return False # generate new funcs = {} attrs = {} process = QProcess() process.start(' '.join([vcc, '-X'])) process.waitForFinished() lines = str(process.readAll()).split('\n') for context in lines: if context: process.start(' '.join([vcc, '-X', context])) process.waitForFinished() context_lines = str(process.readAll()) # variables variables = re.search(r'Global Variables:(.*)Control Statements:', context_lines, re.DOTALL) if variables: lines = variables.group(1).strip().split('\n') for l in lines: s = l.split() if len(s)==3: attrs[s[-1]] = s[-2] # functions pat = r'^\s*(\w+\[?\]?)\s(\w+)(\(.+\))' for l in context_lines.split('\n'): func = re.findall(pat, str(l)) if func: if func[0][1] in funcs: funcs[func[0][1]].append({'ret': func[0][0], 'args':func[0][2]}) else: funcs[func[0][1]] = [{'ret': func[0][0], 'args':func[0][2]}] # save to cache if os.path.exists(cache_file): comp = json.load(open(cache_file)) else: comp = {} comp['functions'] = funcs comp['attributes'] = attrs json.dump(comp, open(cache_file, 'w'), indent=4) return True
class TasksPool(QObject): """ This class allows you to add_task() for execution queue. Launch_list() starts the queue. """ task_done = Signal() return_signal = Signal(str) def __init__(self): super(TasksPool, self).__init__() self.tasks_pool = [] self.process = None if not QApplication.instance(): self.qapp = QApplication([]) def add_task(self, command): """ :type command: str :param command: A console command with arguments Adds a task to the pool for later execution """ self.tasks_pool.append(command) def __execute_task(self, task): """ :param task: Is a string used to start a process """ self.process = QProcess(self) self.process.finished.connect( lambda *x: logger.debug(task + ' reports complete')) self.process.finished.connect(lambda *x: self.return_signal.emit( 'â–º' + task + 'â—„reports complete')) self.process.finished.connect(self.task_done) # self.process.readyRead.connect(lambda *x: print(str(self.process.readAll()))) self.process.readyRead.connect( lambda *x: self.return_signal.emit(str(self.process.readAll()))) self.process.setProcessChannelMode(QProcess.MergedChannels) self.process.start(task) def launch_list(self): """ Starts the execution of the queue in consecutive order, waiting for previous process to finish """ for task in self.tasks_pool: loop = QEventLoop() self.task_done.connect(loop.quit) self.__execute_task(task) loop.exec_()
def run(self) : self.logger.debug("patcher started") for patch in self.patches: mod = patch["mod"] fromFile = patch["patchfile"] toFile = patch["tofilename"] frommd5 = patch["md5"] tomd5 = patch["tomd5"] curPatchGen = "%s-%s.xdelta" % (fromFile, toFile) self.logger.debug(curPatchGen) self.logger.debug("opening database") self.db = QtSql.QSqlDatabase.cloneDatabase(self.parentDb, curPatchGen) source = os.path.join(config['global']['content_path'] + r"updaterNew/", mod, fromFile) target = os.path.join(config['global']['content_path'] + r"updaterNew/", mod, toFile) self.logger.debug(source) self.logger.debug(target) patchdest = os.path.join(config['global']['content_path'] + r"xdelta/", curPatchGen) self.logger.debug(patchdest) if os.path.exists(source) and os.path.exists(target) : executable = "python" arguments = [config['global']['install_path'] + "patcher.py", source, target, patchdest] self.logger.debug(arguments) process = QProcess() process.start(executable, arguments) if not process.waitForFinished(28800000) : return self.db.open() query = QSqlQuery(self.db) queryStr = ("INSERT INTO patchs_table (fromMd5, toMd5, patchFile) VALUES ('%s','%s','%s')") % (frommd5, tomd5, curPatchGen) query.exec_(queryStr) # self.db.close()
def testWithoutArgs(self): """Connect QProcess.started() to QTimeLine.togglePaused()""" process = QProcess() timeline = QTimeLine() QObject.connect(process, SIGNAL("finished(int, QProcess::ExitStatus)"), timeline, SLOT("toggleDirection()")) orig_dir = timeline.direction() process.start(sys.executable, ["-c", '"print 42"']) process.waitForFinished() new_dir = timeline.direction() if orig_dir == QTimeLine.Forward: self.assertEqual(new_dir, QTimeLine.Backward) else: self.assertEqual(new_dir, QTimeLine.Forward)
def is_online(self, tableWidgetItem): Stream.clear_streams() process = QProcess() self.process = process self.table_widget_item = tableWidgetItem arguments = ['--json'] + self.arguments process.setProcessChannelMode(QProcess.MergedChannels) process.start('livestreamer', arguments) process.readyReadStandardOutput.connect(self.is_online_callback) tableWidgetItem.setText('Checking..') Stream.ALL_STREAMS.append(self)
def is_online( self, tableWidgetItem ): Stream.clear_streams() process = QProcess() self.process = process self.table_widget_item = tableWidgetItem arguments = [ '--json' ] + self.arguments process.setProcessChannelMode( QProcess.MergedChannels ) process.start( 'livestreamer', arguments ) process.readyReadStandardOutput.connect( self.is_online_callback ) itemWidget = self.table_widget_item tableWidget = itemWidget.tableWidget() tableWidget.setCellWidget( itemWidget.row(), 0, MovieWidget( fullpath( 'icons/loading_16.gif' ), tableWidget) ) Stream.ALL_STREAMS.append( self )
def start( self, messageElement, tableWidgetItem ): Stream.clear_streams() process = QProcess() self.process = process self.messageElement = messageElement row = tableWidgetItem.row() tableWidget = tableWidgetItem.tableWidget() tableWidget.setCellWidget( tableWidgetItem.row(), 0, ImageWidget( fullpath( 'icons/play_16.png' ), tableWidget) ) tableWidgetItem = tableWidget.item( row, 0 ) process.setProcessChannelMode( QProcess.MergedChannels ) process.start( 'livestreamer', self.arguments ) process.readyReadStandardOutput.connect( self.show_messages ) process.finished.connect( lambda: self.is_online( tableWidgetItem ) ) Stream.ALL_STREAMS.append( self )
def testWithoutArgs(self): '''Connect QProcess.started() to QTimeLine.togglePaused()''' process = QProcess() timeline = QTimeLine() QObject.connect(process, SIGNAL('finished(int, QProcess::ExitStatus)'), timeline, SLOT('toggleDirection()')) orig_dir = timeline.direction() process.start(sys.executable, ['-c', '"print 42"']) process.waitForFinished() new_dir = timeline.direction() if orig_dir == QTimeLine.Forward: self.assertEqual(new_dir, QTimeLine.Backward) else: self.assertEqual(new_dir, QTimeLine.Forward)
class TasksPool(QObject): startNextTaskSignal = Signal() allTasksCompleteSignal = Signal() def __init__(self): super(TasksPool, self).__init__() self.tasks_pool = [] self.process = QProcess() self.startNextTaskSignal.connect(self.execute_task) self.allTasksCompleteSignal.connect(self.tasks_complete) self.source = '' def add_task(self, command): self.tasks_pool.append(command) self.startNextTaskSignal.emit() def execute_task(self): print('Start next?') if self.process.isOpen(): self.process.waitForFinished() if not self.tasks_pool: self.allTasksCompleteSignal.emit() return self.process = QProcess() self.process.finished.connect( lambda *x: QTimer.singleShot(1000, self.startNextTaskSignal.emit)) self.process.setProcessChannelMode(QProcess.MergedChannels) self.process.readyRead.connect(self.process_output) next_task = self.tasks_pool.pop(0) print('NEXT TASK', next_task) self.process.start(next_task) def process_output(self): output = self.process.readAll() output = str(output).strip() if output: print(output) def tasks_complete(self): print('ALL TASKS COMPLETE')
def runtapinstall(args, errorok=False): EXE = '%s/%s' % (TAPDIR, TAPINSTALL) # args.insert(0, EXE) # cmd = ' '.join(args) process = QProcess() process.start(EXE, args) if not process.waitForFinished(): print "tapinstall failed. waitForFinished()" sys.exit(1) output = process.readAll(); rv = process.exitStatus() output=str(output).strip() if rv != 0 and not errorok: print """tapinstall failed. command was: %s output was: %s returnvalue was: %d""" % (cmd, output, rv) sys.exit(1) else: return (rv, output)
def is_online(self, tableWidgetItem): Stream.clear_streams() process = QProcess() self.process = process self.table_widget_item = tableWidgetItem arguments = ['--json'] + self.arguments process.setProcessChannelMode(QProcess.MergedChannels) process.start('livestreamer', arguments) process.readyReadStandardOutput.connect(self.is_online_callback) brush = QBrush(Qt.SolidPattern) color = QColor(255, 255, 255) #white brush.setColor(color) tableWidgetItem.setBackground(brush) tableWidgetItem.setText('Checking..') Stream.ALL_STREAMS.append(self)
def is_online(self, tableWidgetItem): Stream.clear_streams() process = QProcess() self.process = process self.table_widget_item = tableWidgetItem arguments = ["--json"] + self.arguments process.setProcessChannelMode(QProcess.MergedChannels) process.start("livestreamer", arguments) process.readyReadStandardOutput.connect(self.is_online_callback) brush = QBrush(Qt.SolidPattern) color = QColor(255, 255, 255) # white brush.setColor(color) tableWidgetItem.setBackground(brush) tableWidgetItem.setText("Checking..") Stream.ALL_STREAMS.append(self)
def neko(neko_id='neko:v2Yr'): _, id = neko_id.split(":") url = BASE_URL.format(id) if not DEBUG: res = requests.get(url).json() else: res = _response mega_url = res.get("url","") version = res.get("version", -1) if VER != version: print cat print "Hay una version nueva!!! descargala" raw_input("adios ...") return print cat if _platform == "linux" or _platform == "linux2": mega_path = "megadl" mpv_path = "mpv" elif _platform == "darwin": # MAC OS X pass elif _platform == "win32": # Windows mega_path = os.path.join(BASE_DIR, 'mega', 'megadl.exe') mpv_path = os.path.join(BASE_DIR, "mpv","mpv.com") p1 = QProcess() p2 = QProcess() p1.setStandardOutputProcess(p2) p1.start('{}'.format(mega_path), ['{}'.format(mega_url),"--path","-"]) p2.start('{}'.format(mpv_path), ["-" , '--no-terminal']) p2.waitForFinished(-1) #print p2.readAll() # "--path","-",) #cmd = ['"{}"'.format(mega_path), '"{}"'.format(mega_url), # "--path","-","|", # '"{}"'.format(mpv_path), "-" , '--no-terminal'] #'--fullscreen'] print "Cargando...."
class TestPython(object): def __init__(self, ID=None): self.Test = QProcess() self.ID = ID #a and b to test if i get a output or command error self.a = True self.Settings = QtCore.QSettings('Tyrant.cfg', QtCore.QSettings.IniFormat) def TestVersion(self): print('Test python version') self.Test.readyReadStandardError.connect(self.getOutput) self.Test.readyReadStandardOutput.connect(self.getOutput) if self.ID is not None: self.Test.error.connect(self.Error) #if i have a custom pythonpath, i'll use it here Res = Resources() Python = Res.getPref('Python') #test if is a pythonpath, if not open a default if len(Python) < 5: Python = 'python' self.Test.start(Python, ['-V']) self.Test.waitForFinished() self.Test.terminate() if (self.a is False) & (self.ID is None): #test a diferent command to run python 2.7 a = self.TestVersion2() print a return a elif self.a: #say to program that python is working print('Python version found') self.Settings.setValue('Python/PythonPath', str(Python)) self.Settings.sync() return True elif ((self.ID is not None) & (self.a is False)): return False def Error(self): self.a = False def TestVersion2(self): print('Testing python version 2') self.Test.readyReadStandardError.connect(self.getOutput) Python = 'python2.7' self.Test.start(Python, ['-V']) self.Test.waitForStarted() self.Test.waitForFinished() self.Test.terminate() if (self.a is False): #say thar python is not working return False else: self.Settings.setValue('Python/PythonPath', str(Python)) self.Settings.sync() return True def getOutput(self): Out = str(self.Test.readAllStandardError()) print(Out) if Out > 'Python 2.8': self.a = False return self.a = True
class RobocompDslGui(QMainWindow): def __init__(self, parent=None): super(RobocompDslGui, self).__init__(parent) self.setWindowTitle("Create new component") # self._idsl_paths = [] self._communications = { "implements": [], "requires": [], "subscribesTo": [], "publishes": [] } self._interfaces = {} self._cdsl_doc = CDSLDocument() self._command_process = QProcess() self._main_widget = QWidget() self._main_layout = QVBoxLayout() self.setCentralWidget(self._main_widget) self._name_layout = QHBoxLayout() self._name_line_edit = QLineEdit() self._name_line_edit.textEdited.connect(self.update_component_name) self._name_line_edit.setPlaceholderText("New component name") self._name_layout.addWidget(self._name_line_edit) self._name_layout.addStretch() # DIRECTORY SELECTION self._dir_line_edit = QLineEdit() # self._dir_line_edit.textEdited.connect(self.update_completer) self._dir_completer = QCompleter() self._dir_completer_model = QFileSystemModel() if os.path.isdir(ROBOCOMP_COMP_DIR): self._dir_line_edit.setText(ROBOCOMP_COMP_DIR) self._dir_completer_model.setRootPath(ROBOCOMP_COMP_DIR) self._dir_completer.setModel(self._dir_completer_model) self._dir_line_edit.setCompleter(self._dir_completer) self._dir_button = QPushButton("Select directory") self._dir_button.clicked.connect(self.set_output_directory) self._dir_layout = QHBoxLayout() self._dir_layout.addWidget(self._dir_line_edit) self._dir_layout.addWidget(self._dir_button) # LIST OF ROBOCOMP INTERFACES self._interface_list = QListWidget() self._interface_list.setSelectionMode( QAbstractItemView.ExtendedSelection) self._interface_list.itemSelectionChanged.connect( self.set_comunication) # LIST OF CONNECTION TyPES self._type_combo_box = QComboBox() self._type_combo_box.addItems( ["publishes", "implements", "subscribesTo", "requires"]) self._type_combo_box.currentIndexChanged.connect( self.reselect_existing) # BUTTON TO ADD A NEW CONNECTION # self._add_connection_button = QPushButton("Add") # self._add_connection_button.clicked.connect(self.add_new_comunication) self._add_connection_layout = QHBoxLayout() # self._add_connection_layout.addWidget(self._add_connection_button) self._language_combo_box = QComboBox() self._language_combo_box.addItems(["Python", "Cpp", "Cpp11"]) self._language_combo_box.currentIndexChanged.connect( self.update_language) self._add_connection_layout.addWidget(self._language_combo_box) self._add_connection_layout.addStretch() self._gui_check_box = QCheckBox() self._gui_check_box.stateChanged.connect(self.update_gui_selection) self._gui_label = QLabel("Use Qt GUI") self._add_connection_layout.addWidget(self._gui_label) self._add_connection_layout.addWidget(self._gui_check_box) # WIDGET CONTAINING INTERFACES AND TYPES self._selection_layout = QVBoxLayout() self._selection_layout.addWidget(self._type_combo_box) self._selection_layout.addWidget(self._interface_list) self._selection_layout.addLayout(self._add_connection_layout) self._selection_widget = QWidget() self._selection_widget.setLayout(self._selection_layout) # TEXT EDITOR WITH THE RESULTING CDSL CODE self._editor = QTextEdit(self) self._editor.setHtml("") self._document = self._editor.document() self._component_directory = None # SPLITTER WITH THE SELECTION AND THE CODE self._body_splitter = QSplitter(Qt.Horizontal) self._body_splitter.addWidget(self._selection_widget) self._body_splitter.addWidget(self._editor) self._body_splitter.setStretchFactor(0, 2) self._body_splitter.setStretchFactor(1, 9) # CREATION BUTTONS self._create_button = QPushButton("Create .cdsl") self._create_button.clicked.connect(self.write_cdsl_file) self._creation_layout = QHBoxLayout() self._creation_layout.addStretch() self._creation_layout.addWidget(self._create_button) self._console = QConsole() self._command_process.readyReadStandardOutput.connect( self._console.standard_output) self._command_process.readyReadStandardError.connect( self._console.error_output) # ADDING WIDGETS TO MAIN LAYOUT self._main_widget.setLayout(self._main_layout) self._main_layout.addLayout(self._name_layout) self._main_layout.addLayout(self._dir_layout) self._main_layout.addWidget(self._body_splitter) self._main_layout.addLayout(self._creation_layout) self._main_layout.addWidget(self._console) self.setMinimumSize(800, 500) self._editor.setText(self._cdsl_doc.generate_doc()) # self.editor->show(); # def update_completer(self, path): # print "update_completer %s"%path # info = QFileInfo(path) # if info.exists() and info.isDir(): # if not path.endswith(os.path.pathsep): # new_path = os.path.join(path, os.sep) # # self._dir_line_edit.setText(new_path) # all_dirs_output = [dI for dI in os.listdir(path) if os.path.isdir(os.path.join(path, dI))] # print all_dirs_output # self._dir_completer.complete() def load_idsl_files(self, fullpath=None): if fullpath is None: fullpath = ROBOCOMP_INTERFACES idsls_dir = os.path.join(ROBOCOMP_INTERFACES, "IDSLs") if os.path.isdir(idsls_dir): for full_filename in os.listdir(idsls_dir): file_name, file_extension = os.path.splitext(full_filename) if "idsl" in file_extension.lower(): full_idsl_path = os.path.join(idsls_dir, full_filename) # self._idsl_paths.append(os.path.join(idsls_dir,full_filename)) self.parse_idsl_file(full_idsl_path) self._interface_list.addItems(self._interfaces.keys()) def parse_idsl_file(self, fullpath): with open(fullpath, 'r') as fin: interface_name = None for line in fin: result = re.findall(r'^\s*interface\s+(\w+)\s*\{?\s*$', line, flags=re.MULTILINE) if len(result) > 0: interface_name = result[0] print("%s for idsl %s" % (interface_name, fullpath)) if interface_name is not None: self._interfaces[interface_name] = fullpath def add_new_comunication(self): interface_names = self._interface_list.selectedItems() com_type = str(self._type_combo_box.currentText()) for iface_name_item in interface_names: iface_name = str(iface_name_item.text()) self._communications[com_type].append(iface_name) idsl_full_path = self._interfaces[iface_name] idsl_full_filename = os.path.basename(idsl_full_path) self._cdsl_doc.add_comunication(com_type, iface_name) self._cdsl_doc.add_import(idsl_full_filename) self.update_editor() def set_comunication(self): interface_names = self._interface_list.selectedItems() com_type = str(self._type_combo_box.currentText()) self._communications[com_type] = [] self._cdsl_doc.clear_comunication(com_type) for iface_name_item in interface_names: iface_name = str(iface_name_item.text()) self._communications[com_type].append(iface_name) self._cdsl_doc.add_comunication(com_type, iface_name) self.update_imports() self.update_editor() def update_imports(self): self._cdsl_doc.clear_imports() for com_type in self._communications: for iface_name in self._communications[com_type]: idsl_full_path = self._interfaces[iface_name] idsl_full_filename = os.path.basename(idsl_full_path) self._cdsl_doc.add_import(idsl_full_filename) def update_language(self): language = self._language_combo_box.currentText() self._cdsl_doc.set_language(str(language)) self.update_editor() def update_gui_selection(self): checked = self._gui_check_box.isChecked() if checked: self._cdsl_doc.set_qui(True) else: self._cdsl_doc.set_qui(False) self.update_editor() def update_component_name(self, name): self._cdsl_doc.set_name(name) self.update_editor() def update_editor(self): self._editor.setText(self._cdsl_doc.generate_doc()) def set_output_directory(self): dir_set = False while not dir_set: dir = QFileDialog.getExistingDirectory( self, "Select Directory", ROBOCOMP_COMP_DIR, QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks) if self.check_dir_is_empty(str(dir)): self._dir_line_edit.setText(dir) dir_set = True def write_cdsl_file(self): component_dir = str(self._dir_line_edit.text()) text = self._cdsl_doc.generate_doc() if not self._name_line_edit.text(): component_name, ok = QInputDialog.getText(self, 'No component name set', 'Enter component name:') if ok: self.update_component_name(component_name) self._name_line_edit.setText(component_name) else: return False if not os.path.exists(component_dir): if QMessageBox.Yes == QMessageBox.question( self, "Directory doesn't exist.", "Do you want create the directory %s?" % component_dir, QMessageBox.Yes | QMessageBox.No): os.makedirs(component_dir) else: QMessageBox.question( self, "Directory not exist", "Can't create a component witout a valid directory") return False file_path = os.path.join(component_dir, str(self._name_line_edit.text()) + ".cdsl") if os.path.exists(file_path): if QMessageBox.No == QMessageBox.question( self, "File already exists", "Do you want to overwrite?", QMessageBox.Yes | QMessageBox.No): return False with open(file_path, 'w') as the_file: the_file.write(text) self.execute_robocomp_cdsl() return True def execute_robocomp_cdsl(self): cdsl_file_path = os.path.join( str(self._dir_line_edit.text()), str(self._name_line_edit.text()) + ".cdsl") command = "python -u %s/robocompdsl.py %s %s" % ( ROBOCOMPDSL_DIR, cdsl_file_path, os.path.join(str(self._dir_line_edit.text()))) self._console.append_custom_text("%s\n" % command) self._command_process.start(command, QProcess.Unbuffered | QProcess.ReadWrite) def reselect_existing(self): com_type = self._type_combo_box.currentText() selected = self._communications[com_type] self._interface_list.clearSelection() for iface in selected: items = self._interface_list.findItems(iface, Qt.MatchFlag.MatchExactly) if len(items) > 0: item = items[0] item.setSelected(True) def check_dir_is_empty(self, dir_path): if len(os.listdir(dir_path)) > 0: msgBox = QMessageBox() msgBox.setWindowTitle("Directory not empty") msgBox.setText( "The selected directory is not empty.\n" "For a new Component you usually want a new directory.\n" "Do you want to use this directory anyway?") msgBox.setStandardButtons(QMessageBox.Yes) msgBox.addButton(QMessageBox.No) msgBox.setDefaultButton(QMessageBox.No) if msgBox.exec_() == QMessageBox.Yes: return True else: return False else: return True
def parse_asn1(*files, **options): ''' Call the ASN.1 parser on a number of files, and return the module containing the AST This function uses QProcess to launch the ASN.1 compiler because the subprocess module from Python has issues on the Windows platform ''' # use basic caching to avoid re-parsing when loading the model project_cache = os.getenv ("PROJECT_CACHE") if project_cache is not None and not os.path.isdir(project_cache): raise TypeError ( "The configured cache folder \"" + project_cache + "\" is not there!\n") # make sure the same files are not parsed more than once if not modified filehash = hashlib.md5() file_list = sorted(list(*files)) try: for each in file_list: filehash.update(open(each).read()) # also hash the file path: it is used in the AST, so it is # not enough to hash the content of the ASN.1 files, as two sets # of input files may have the same hash filehash.update(each) except IOError as err: raise TypeError (str(err)) new_hash = filehash.hexdigest() # names of the files that will be generated by asn1scc and then parsed out_py_name = new_hash + ".py" out_html_name = new_hash + ".html" if new_hash in AST.viewkeys(): return AST[new_hash] elif project_cache is not None: outdir = project_cache elif project_cache is None: outdir = tempfile.mkdtemp() # to allow the import sys.path.append(outdir) ast_version = options.get('ast_version', ASN1.UniqueEnumeratedNames) rename_policy = options.get('rename_policy', ASN1.NoRename) flags = options.get('flags', [ASN1.AstOnly]) pprint = options.get('pretty_print', False) assert isinstance(ast_version, ASN1) assert isinstance(rename_policy, ASN1) assert isinstance(flags, list) path_to_asn1scc = spawn.find_executable('asn1.exe') if not path_to_asn1scc: raise TypeError('ASN.1 Compiler not found in path') if os.name == 'posix': path_to_mono = spawn.find_executable('mono') if not path_to_mono: raise TypeError('"mono" not found in path. Please install it.') binary = path_to_mono arg0 = path_to_asn1scc else: binary = path_to_asn1scc arg0 = '' asn1scc_root = os.path.abspath(os.path.dirname(path_to_asn1scc)) if os.name == 'nt': # On windows, remove the drive letter, workaround to ASN1SCC bug outdir = outdir[2:] asn1scc_root = asn1scc_root[2:] # The two possible files that can be generated with complete path: py_filepath = outdir + os.sep + out_py_name html_filepath = outdir + os.sep + out_html_name # call the ASN.1 compiler only if there is no existing cached file if project_cache is None or not os.path.exists(py_filepath): stg = asn1scc_root + os.sep + 'python.stg' if pprint: # Generate an html file with pretty-printed ASN.1 types stg_qrc = QFile(':misc/pretty_print_asn1.stg') stg_qrc.open(1) content = stg_qrc.readAll() stgfile = outdir + os.sep + 'pretty_print_asn1.stg' with open(stgfile, 'w') as tmpfile: tmpfile.write(content.data()) html = ['-customIcdUper', stgfile + '::' + html_filepath] else: html = [] args = [arg0, '-customStgAstVersion', str(ast_version.value), '-customStg', stg + '::' + py_filepath, '-renamePolicy', str(rename_policy.value)] + html + file_list asn1scc = QProcess() LOG.debug(os.getcwd()) LOG.debug(binary + ' ' + ' '.join(args)) asn1scc.start(binary, args) _ = waitfor_qprocess(asn1scc, "ASN.1 Compiler") ast = importlib.import_module(new_hash) AST[new_hash] = ast if pprint: # add the path to the optionally-generated pretty-printed HTML file ast.html = html_filepath return ast
class VideoMediaView(MediaView): def __init__(self, media, parent): super(VideoMediaView, self).__init__(media, parent) self._widget = QWidget(parent) self._process = QProcess(self._widget) self._process.setObjectName('%s-process' % self.objectName()) self._std_out = [] self._errors = [] self._stopping = False self._mute = False if 'mute' in self._options: self._mute = bool(int(self._options['mute'])) self._widget.setGeometry(media['_geometry']) self.connect(self._process, SIGNAL("error()"), self._process_error) self.connect(self._process, SIGNAL("finished()"), self.stop) self.connect(self._process, SIGNAL("readyReadStandardOutput()"), self.__grep_std_out) self.set_default_widget_prop() self._stop_timer = QTimer(self) self._stop_timer.setSingleShot(True) self._stop_timer.setInterval(1000) self._stop_timer.timeout.connect(self._force_stop) @Slot() def _force_stop(self): os.kill(self._process.pid(), signal.SIGTERM) self._stopping = False if not self.is_started(): self.started_signal.emit() super(VideoMediaView, self).stop() @Slot(object) def _process_error(self, err): self._errors.append(err) self.stop() @Slot() def play(self): self._finished = 0 path = "%s/%s" % (self._save_dir, self._options['uri']) self._widget.show() args = [ '-slave', '-identify', '-input', 'nodefault-bindings:conf=/dev/null', '-wid', str(int(self._widget.winId())), path ] if self._mute: args += ['-ao', 'null'] self._process.start('mplayer', args) self._stop_timer.start() @Slot() def stop(self, delete_widget=False): if self._stopping or self.is_finished(): return False self._stop_timer.start() self._stopping = True if self._process.state() == QProcess.ProcessState.Running: self._process.write("quit\n") self._process.waitForFinished(50) self._process.close() super(VideoMediaView, self).stop(delete_widget) self._stopping = False self._stop_timer.stop() return True @Slot() def __grep_std_out(self): lines = self._process.readAllStandardOutput().split("\n") for line in lines: if not line.isEmpty(): if line.startsWith("Starting playback"): self._widget.raise_() self._play_timer.start() self.started_signal.emit() self._stop_timer.stop() else: part = line.split("=") if 'ID_LENGTH' == part[0]: if float(self._duration) > 0: # user set the video duration manually. self._play_timer.setInterval(int(1000 * float(self._duration))) else: # use duration found by mplayer. self._play_timer.setInterval(int(1000 * float(part[1])))
class VideoMediaView(MediaView): def __init__(self, media, parent): super(VideoMediaView, self).__init__(media, parent) self.widget = QWidget(parent) self.process = QProcess(self.widget) self.process.setObjectName('%s-process' % self.objectName()) self.std_out = [] self.errors = [] self.stopping = False self.mute = False self.widget.setGeometry(media['geometry']) self.connect(self.process, SIGNAL('error()'), self.process_error) self.connect(self.process, SIGNAL('finished()'), self.process_finished) self.connect(self.process, SIGNAL('started()'), self.process_started) self.set_default_widget_prop() self.stop_timer = QTimer(self) self.stop_timer.setSingleShot(True) self.stop_timer.setInterval(1000) self.stop_timer.timeout.connect(self.process_timeout) #---- kong ---- for RPi self.rect = media['geometry'] self.omxplayer = True #---- @Slot() def process_timeout(self): os.kill(self.process.pid(), signal.SIGTERM) self.stopping = False if not self.is_started(): self.started_signal.emit() super(VideoMediaView, self).stop() @Slot(object) def process_error(self, err): print '---- process error ----' self.errors.append(err) self.stop() @Slot() def process_finished(self): self.stop() @Slot() def process_started(self): self.stop_timer.stop() if float(self.duration) > 0: self.play_timer.setInterval(int(float(self.duration) * 1000)) self.play_timer.start() self.started_signal.emit() pass @Slot() def play(self): self.finished = 0 self.widget.show() self.widget.raise_() path = '%s/%s' % (self.save_dir, self.options['uri']) #---- kong ---- if self.omxplayer is True: left, top, right, bottom = self.rect.getCoords() rect = '%d,%d,%d,%d' % (left, top, right, bottom) args = ['--win', rect, '--no-osd', '--layer', self.zindex, path] self.process.start('omxplayer.bin', args) self.stop_timer.start() else: args = [ '-slave', '-identify', '-input', 'nodefault-bindings:conf=/dev/null', '-wid', str(int(self.widget.winId())), path ] self.process.start('mplayer', args) self.stop_timer.start() #---- @Slot() def stop(self, delete_widget=False): #---- kong ---- if not self.widget: return False if self.stopping or self.is_finished(): return False self.stop_timer.start() self.stopping = True if self.process.state() == QProcess.ProcessState.Running: if self.omxplayer is True: self.process.write('q') else: self.process.write('quit\n') self.process.waitForFinished() self.process.close() super(VideoMediaView, self).stop(delete_widget) self.stopping = False self.stop_timer.stop() return True
class VideoMediaView(MediaView): def __init__(self, media, parent): super(VideoMediaView, self).__init__(media, parent) self._widget = QWidget(parent) self._process = QProcess(self._widget) self._process.setObjectName('%s-process' % self.objectName()) self._std_out = [] self._errors = [] self._stopping = False self._mute = False if 'mute' in self._options: self._mute = bool(int(self._options['mute'])) self._widget.setGeometry(media['_geometry']) self.connect(self._process, SIGNAL("error()"), self._process_error) self.connect(self._process, SIGNAL("finished()"), self.stop) self.connect(self._process, SIGNAL("readyReadStandardOutput()"), self.__grep_std_out) self.set_default_widget_prop() self._stop_timer = QTimer(self) self._stop_timer.setSingleShot(True) self._stop_timer.setInterval(1000) self._stop_timer.timeout.connect(self._force_stop) @Slot() def _force_stop(self): os.kill(self._process.pid(), signal.SIGTERM) self._stopping = False if not self.is_started(): self.started_signal.emit() super(VideoMediaView, self).stop() @Slot(object) def _process_error(self, err): self._errors.append(err) self.stop() @Slot() def play(self): self._finished = 0 path = "%s/%s" % (self._save_dir, self._options['uri']) self._widget.show() args = [ '-slave', '-identify', '-input', 'nodefault-bindings:conf=/dev/null', '-wid', str(int(self._widget.winId())), path ] if self._mute: args += ['-ao', 'null'] self._process.start('mplayer', args) self._stop_timer.start() @Slot() def stop(self, delete_widget=False): if self._stopping or self.is_finished(): return False self._stop_timer.start() self._stopping = True if self._process.state() == QProcess.ProcessState.Running: self._process.write("quit\n") self._process.waitForFinished(50) self._process.close() super(VideoMediaView, self).stop(delete_widget) self._stopping = False self._stop_timer.stop() return True @Slot() def __grep_std_out(self): lines = self._process.readAllStandardOutput().split("\n") for line in lines: if not line.isEmpty(): if line.startsWith("Starting playback"): self._widget.raise_() self._play_timer.start() self.started_signal.emit() self._stop_timer.stop() else: part = line.split("=") if 'ID_LENGTH' == part[0]: if float( self._duration ) > 0: # user set the video duration manually. self._play_timer.setInterval( int(1000 * float(self._duration))) else: # use duration found by mplayer. self._play_timer.setInterval( int(1000 * float(part[1])))
class WebMediaView(MediaView): def __init__(self, media, parent): super(WebMediaView, self).__init__(media, parent) self.widget = QWidget(parent) self.process = QProcess(self.widget) self.process.setObjectName('%s-process' % self.objectName()) self.std_out = [] self.errors = [] self.stopping = False self.mute = False self.widget.setGeometry(media['geometry']) self.connect(self.process, SIGNAL('error()'), self.process_error) self.connect(self.process, SIGNAL('finished()'), self.process_finished) self.connect(self.process, SIGNAL('started()'), self.process_started) self.set_default_widget_prop() self.stop_timer = QTimer(self) self.stop_timer.setSingleShot(True) self.stop_timer.setInterval(1000) self.stop_timer.timeout.connect(self.process_timeout) self.rect = self.widget.geometry() @Slot() def process_timeout(self): os.kill(self.process.pid(), signal.SIGTERM) self.stopping = False if not self.is_started(): self.started_signal.emit() super(WebMediaView, self).stop() @Slot(object) def process_error(self, err): print '---- process error ----' self.errors.append(err) self.stop() @Slot() def process_finished(self): self.stop() @Slot() def process_started(self): self.stop_timer.stop() if float(self.duration) > 0: self.play_timer.setInterval(int(float(self.duration) * 1000)) self.play_timer.start() self.started_signal.emit() pass @Slot() def play(self): self.finished = 0 self.widget.show() self.widget.raise_() #---- kong ---- url = self.options['uri'] args = [ #'--kiosk', str(self.rect.left()), str(self.rect.top()), str(self.rect.width()), str(self.rect.height()), QUrl.fromPercentEncoding(url) ] #self.process.start('chromium-browser', args) self.process.start('./dist/web', args) self.stop_timer.start() #---- @Slot() def stop(self, delete_widget=False): #---- kong ---- if not self.widget: return False if self.stopping or self.is_finished(): return False self.stop_timer.start() self.stopping = True if self.process.state() == QProcess.ProcessState.Running: #os.system('pkill chromium') os.system('pkill web') self.process.waitForFinished() self.process.close() super(WebMediaView, self).stop(delete_widget) self.stopping = False self.stop_timer.stop() return True
def parse_asn1(*files, **options): """ Call the ASN.1 parser on a number of files, and return the module containing the AST This function uses QProcess to launch the ASN.1 compiler because the subprocess module from Python has issues on the Windows platform """ global AST ast_version = options.get("ast_version", ASN1.UniqueEnumeratedNames) rename_policy = options.get("rename_policy", ASN1.NoRename) flags = options.get("flags", [ASN1.AstOnly]) assert isinstance(ast_version, ASN1) assert isinstance(rename_policy, ASN1) assert isinstance(flags, list) # if os.name == 'posix' and hasattr(sys, 'frozen'): # Frozen Linux binaries are expected to use the frozen ASN.1 compiler # No: there are issues with freezing the .NET applications - discard # asn1exe = 'asn1scc' # else: # asn1exe = 'asn1.exe' path_to_asn1scc = spawn.find_executable("asn1.exe") if not path_to_asn1scc: raise TypeError("ASN.1 Compiler not found in path") if os.name == "posix": path_to_mono = spawn.find_executable("mono") if not path_to_mono: raise TypeErorr('"mono" not found in path. Please install it.') binary = path_to_mono arg0 = path_to_asn1scc else: binary = path_to_asn1scc arg0 = "" asn1scc_root = os.path.abspath(os.path.dirname(path_to_asn1scc)) # Create a temporary directory to store dataview.py and import it tempdir = tempfile.mkdtemp() sys.path.append(tempdir) if os.name == "nt": # On windows, remove the drive letter, workaround to ASN1SCC bug tempdir = tempdir[2:] asn1scc_root = asn1scc_root[2:] filename = str(uuid.uuid4()).replace("-", "_") filepath = tempdir + os.sep + filename + ".py" stg = asn1scc_root + os.sep + "python.stg" args = [ arg0, "-customStgAstVerion", str(ast_version.value), "-customStg", stg + "::" + filepath, "-renamePolicy", str(rename_policy.value), ] + list(*files) asn1scc = QProcess() LOG.debug(os.getcwd()) LOG.debug(binary + " " + " ".join(args)) asn1scc.start(binary, args) if not asn1scc.waitForStarted(): raise TypeError("Could not start ASN.1 Compiler") if not asn1scc.waitForFinished(): raise TypeError("Execution of ASN.1 Compiler timed out") exitcode = asn1scc.exitCode() result = asn1scc.readAllStandardError() if exitcode != 0: raise TypeError("ASN.1 Compiler Error (exit code = {}) - {}".format(exitcode, str(result))) else: if filename in AST.viewkeys(): # Re-import module if it was already loaded ast = AST[filename] reload(ast) else: ast = importlib.import_module(filename) AST[filename] = ast return ast
class LaunchGUI(QtGui.QDialog): def __init__(self, app): super(LaunchGUI, self).__init__() self.app = app self.init_gui_layout() def init_gui_layout(self): gui_fname = pkg_resources.resource_filename( 'circus', os.path.join('qt_GUI', 'qt_launcher.ui')) self.ui = uic.loadUi(gui_fname) self.task_comboboxes = [ cb for cb in self.ui.grp_tasks.children() if isinstance(cb, QCheckBox) ] logo = pkg_resources.resource_filename( 'circus', os.path.join('icons', 'icon.png')) self.ui.setWindowIcon(QtGui.QIcon(logo)) try: import cudamat as cmt cmt.init() self.HAVE_CUDA = True except Exception: self.HAVE_CUDA = False self.ui.btn_run.clicked.connect(self.run) self.ui.btn_plots.clicked.connect(self.open_plot_folder) self.ui.btn_param.clicked.connect(self.view_param) self.ui.btn_phy.clicked.connect(self.help_phy) self.ui.btn_matlab.clicked.connect(self.help_matlab) self.ui.btn_help_cpus.clicked.connect(self.help_cpus) self.ui.btn_help_gpus.clicked.connect(self.help_gpus) self.ui.btn_help_file_format.clicked.connect(self.help_file_format) self.ui.tabWidget.currentChanged.connect(self.changing_tab) self.ui.btn_stop.clicked.connect(self.stop) self.ui.btn_file.clicked.connect(self.update_data_file) self.ui.btn_about.clicked.connect(self.show_about) self.ui.rb_gui_matlab.clicked.connect(self.update_gui_command) self.ui.rb_gui_python.clicked.connect(self.update_gui_command) self.ui.btn_output.clicked.connect(self.update_output_file) self.ui.btn_hostfile.clicked.connect(self.update_host_file) self.ui.btn_log.clicked.connect(self.open_log_file) self.ui.cb_batch.toggled.connect(self.update_batch_mode) self.ui.cb_preview.toggled.connect(self.update_preview_mode) self.ui.cb_results.toggled.connect(self.update_results_mode) self.ui.cb_benchmarking.toggled.connect(self.update_benchmarking) self.ui.cb_merging.toggled.connect(self.update_extension) self.ui.cb_converting.toggled.connect(self.update_extension) self.update_benchmarking() self.update_extension() for cb in self.task_comboboxes: cb.toggled.connect(self.store_tasks) cb.toggled.connect(self.update_command) self.ui.edit_file.textChanged.connect(self.update_command) self.ui.edit_output.textChanged.connect(self.update_command) self.ui.edit_hostfile.textChanged.connect(self.update_command) self.ui.edit_extension.textChanged.connect(self.update_command) self.ui.gui_extension.textChanged.connect(self.update_gui_command) self.ui.spin_cpus.valueChanged.connect(self.update_command) if not self.HAVE_CUDA: self.ui.spin_gpus.setEnabled(False) self.ui.spin_gpus.valueChanged.connect(self.update_command) self.store_tasks() self.process = None self.ui.closeEvent = self.closeEvent self.last_log_file = None try: import sklearn except ImportError: self.ui.cb_validating.setEnabled(False) self.ui.show() def store_tasks(self): self.stored_tasks = [cb.isChecked() for cb in self.task_comboboxes] if not numpy.any(self.stored_tasks): self.ui.btn_run.setEnabled(False) elif str(self.ui.edit_file.text()) != '': self.ui.btn_run.setEnabled(True) self.ui.btn_plots.setEnabled(True) def restore_tasks(self): for cb, prev_state in zip(self.task_comboboxes, self.stored_tasks): cb.setEnabled(True) cb.setChecked(prev_state) def update_batch_mode(self): batch_mode = self.ui.cb_batch.isChecked() self.ui.spin_cpus.setEnabled(not batch_mode) self.ui.spin_gpus.setEnabled(not batch_mode) self.ui.edit_hostfile.setEnabled(not batch_mode) self.ui.btn_hostfile.setEnabled(not batch_mode) self.update_tasks() self.update_extension() self.update_benchmarking() if batch_mode: self.ui.spin_cpus.setEnabled(not batch_mode) self.ui.spin_gpus.setEnabled(not batch_mode) self.ui.edit_hostfile.setEnabled(not batch_mode) self.ui.btn_hostfile.setEnabled(not batch_mode) self.update_tasks() self.update_extension() self.update_benchmarking() self.update_command() self.ui.cb_preview.setChecked(False) self.ui.cb_results.setChecked(False) self.ui.lbl_file.setText('Command file') else: self.last_mode = None self.ui.lbl_file.setText('Data file') self.update_command() def changing_tab(self): if self.ui.tabWidget.currentIndex() == 0: self.update_command() elif self.ui.tabWidget.currentIndex() == 1: self.update_gui_command() def update_preview_mode(self): preview_mode = self.ui.cb_preview.isChecked() self.update_tasks() if preview_mode: self.ui.cb_batch.setChecked(False) self.ui.cb_results.setChecked(False) self.update_command() def update_results_mode(self): results_mode = self.ui.cb_results.isChecked() self.ui.spin_cpus.setEnabled(not results_mode) self.ui.spin_gpus.setEnabled(not results_mode) self.ui.edit_hostfile.setEnabled(not results_mode) self.ui.btn_hostfile.setEnabled(not results_mode) self.update_tasks() self.update_extension() self.update_benchmarking() self.update_command() if results_mode: self.ui.cb_batch.setChecked(False) self.ui.cb_preview.setChecked(False) def update_result_tab(self): if str(self.ui.edit_file.text()) != '': f_next, _ = os.path.splitext(str(self.ui.edit_file.text())) ft = os.path.basename(os.path.normpath(f_next)) f_results = os.path.join(f_next, ft + '.result.hdf5') if os.path.exists(f_results): self.ui.selection_gui.setEnabled(True) self.ui.extension_gui.setEnabled(True) else: self.ui.selection_gui.setEnabled(False) self.ui.extension_gui.setEnabled(False) def update_extension(self): batch_mode = self.ui.cb_batch.isChecked() if (not batch_mode and (self.ui.cb_merging.isChecked() or self.ui.cb_converting.isChecked())): self.ui.edit_extension.setEnabled(True) else: self.ui.edit_extension.setEnabled(False) def update_benchmarking(self): batch_mode = self.ui.cb_batch.isChecked() enable = not batch_mode and self.ui.cb_benchmarking.isChecked() self.ui.edit_output.setEnabled(enable) self.ui.btn_output.setEnabled(enable) self.ui.cmb_type.setEnabled(enable) self.update_command() def update_tasks(self): batch_mode = self.ui.cb_batch.isChecked() preview_mode = self.ui.cb_preview.isChecked() results_mode = self.ui.cb_results.isChecked() if batch_mode or results_mode: self.restore_tasks() for cb in self.task_comboboxes: cb.setEnabled(False) elif preview_mode: prev_stored_tasks = self.stored_tasks for cb in self.task_comboboxes: cb.setEnabled(False) cb.setChecked(False) self.ui.cb_filtering.setChecked(True) self.ui.cb_whitening.setChecked(True) self.stored_tasks = prev_stored_tasks else: # We come back from batch or preview mode self.restore_tasks() self.update_command() def update_data_file(self): if self.ui.cb_batch.isChecked(): title = 'Select file with list of commands' else: title = 'Select data file' fname = QFileDialog.getOpenFileName(self, title, self.ui.edit_file.text()) if fname: self.ui.edit_file.setText(fname) if str(self.ui.edit_file.text()) != '': self.ui.btn_run.setEnabled(True) f_next, _ = os.path.splitext(str(self.ui.edit_file.text())) f_params = f_next + '.params' if os.path.exists(f_params): self.ui.btn_param.setEnabled(True) self.ui.btn_plots.setEnabled(True) else: self.ui.btn_run.setEnabled(False) if self.ui.tabWidget.currentIndex() == 0: self.update_command() elif self.ui.tabWidget.currentIndex() == 1: self.update_gui_command() self.update_result_tab() def update_host_file(self): fname = QFileDialog.getOpenFileName(self, 'Select MPI host file', self.ui.edit_hostfile.text()) if fname: self.ui.edit_hostfile.setText(fname) def update_output_file(self): fname = QFileDialog.getSaveFileName(self, 'Output file name', self.ui.edit_output.text()) if fname: self.ui.edit_output.setText(fname) def open_log_file(self): assert self.last_log_file is not None QDesktopServices.openUrl(QUrl(self.last_log_file)) def gui_command_line_args(self): if self.ui.rb_gui_matlab.isChecked(): args = ['circus-gui-matlab'] elif self.ui.rb_gui_python.isChecked(): args = ['circus-gui-python'] fname = str(self.ui.edit_file.text()).strip() if fname: args.append(fname) extension = str(self.ui.gui_extension.text()).strip() if extension: args.extend(['--extension', extension]) return args def command_line_args(self): batch_mode = self.ui.cb_batch.isChecked() preview_mode = self.ui.cb_preview.isChecked() results_mode = self.ui.cb_results.isChecked() args = ['spyking-circus'] fname = str(self.ui.edit_file.text()).strip() if fname: args.append(fname) if batch_mode: args.append('--batch') elif preview_mode: args.append('--preview') if self.ui.spin_cpus.value() > 1: args.extend(['--cpu', str(self.ui.spin_cpus.value())]) if self.ui.spin_gpus.value() > 0: args.extend(['--gpu', str(self.ui.spin_gpus.value())]) elif results_mode: args.append('--result') else: tasks = [] for cb in self.task_comboboxes: if cb.isChecked(): label = str(cb.text()).lower() tasks.append(label) if len(tasks) > 0: args.extend(['--method', ','.join(tasks)]) if self.ui.spin_cpus.value() > 1: args.extend(['--cpu', str(self.ui.spin_cpus.value())]) if self.ui.spin_gpus.value() > 0: args.extend(['--gpu', str(self.ui.spin_gpus.value())]) hostfile = str(self.ui.edit_hostfile.text()).strip() if hostfile: args.extend(['--hostfile', hostfile]) if 'merging' in tasks or 'converting' in tasks: extension = str(self.ui.edit_extension.text()).strip() if extension: args.extend(['--extension', extension]) if 'benchmarking' in tasks: args.extend(['--output', str(self.ui.edit_output.text())]) args.extend(['--type', str(self.ui.cmb_type.currentText())]) return args def update_gui_command(self): args = ' '.join(self.gui_command_line_args()) self.ui.edit_command.setPlainText(args) def update_command(self, text=None): args = ' '.join(self.command_line_args()) self.ui.edit_command.setPlainText(args) def run(self): if self.ui.cb_batch.isChecked(): self.last_log_file = None else: f_next, _ = os.path.splitext(str(self.ui.edit_file.text())) f_params = f_next + '.params' if not os.path.exists(f_params): self.create_params_file(f_params) self.ui.btn_param.setEnabled(True) return self.last_log_file = f_next + '.log' if self.ui.tabWidget.currentIndex() == 0: args = self.command_line_args() elif self.ui.tabWidget.currentIndex() == 1: args = self.gui_command_line_args() self.update_result_tab() # # Start process self.ui.edit_stdout.clear() format = self.ui.edit_stdout.currentCharFormat() format.setFontWeight(QFont.Normal) format.setForeground(QtCore.Qt.blue) self.ui.edit_stdout.setCurrentCharFormat(format) time_str = datetime.datetime.now().ctime() start_msg = '''\ Starting spyking circus at {time_str}. Command line call: {call} '''.format(time_str=time_str, call=' '.join(args)) self.ui.edit_stdout.appendPlainText(textwrap.dedent(start_msg)) format.setForeground(QtCore.Qt.black) self.ui.edit_stdout.setCurrentCharFormat(format) self.ui.edit_stdout.appendPlainText('\n') self.process = QProcess(self) self.connect(self.process, SIGNAL('readyReadStandardOutput()'), self.append_output) self.connect(self.process, SIGNAL('readyReadStandardError()'), self.append_error) self.connect(self.process, SIGNAL('started()'), self.process_started) self.connect(self.process, SIGNAL('finished(int)'), self.process_finished) self.connect(self.process, SIGNAL('error()'), self.process_errored) self._interrupted = False self.process.start(args[0], args[1:]) def restore_gui(self): for widget, previous_state in self._previous_state: widget.setEnabled(previous_state) self.app.restoreOverrideCursor() def process_started(self): # Disable everything except for the stop button and the output area all_children = [ obj for obj in self.ui.findChildren(QWidget) if isinstance(obj, (QCheckBox, QPushButton, QLineEdit)) ] self._previous_state = [(obj, obj.isEnabled()) for obj in all_children] for obj in all_children: obj.setEnabled(False) self.ui.btn_stop.setEnabled(True) # If we let the user interact, this messes with the cursor we use to # support the progress bar display self.ui.edit_stdout.setTextInteractionFlags(Qt.NoTextInteraction) self.app.setOverrideCursor(Qt.WaitCursor) def process_finished(self, exit_code): format = self.ui.edit_stdout.currentCharFormat() format.setFontWeight(QFont.Bold) if exit_code == 0: if self._interrupted: color = QtCore.Qt.red msg = ('Process interrupted by user') else: color = QtCore.Qt.green msg = ('Process exited normally') else: color = QtCore.Qt.red msg = ('Process exited with exit code %d' % exit_code) format.setForeground(color) self.ui.edit_stdout.setCurrentCharFormat(format) self.ui.edit_stdout.appendPlainText(msg) self.restore_gui() self.ui.edit_stdout.setTextInteractionFlags( Qt.TextSelectableByMouse | Qt.TextSelectableByKeyboard) self.process = None self.ui.btn_log.setEnabled(self.last_log_file is not None and os.path.isfile(self.last_log_file)) def process_errored(self): exit_code = self.process.exitCode() format = self.ui.edit_stdout.currentCharFormat() format.setFontWeight(QFont.Bold) format.setForeground(QtCore.Qt.red) self.ui.edit_stdout.setCurrentCharFormat(format) self.ui.edit_stdout.appendPlainText('Process exited with exit code' % exit_code) self.restore_gui() self.ui.edit_stdout.setTextInteractionFlags( Qt.TextSelectableByMouse | Qt.TextSelectableByKeyboard) self.process = None def add_output_lines(self, lines): ''' Add the output line by line to the text area, jumping back to the beginning of the line when we encounter a carriage return (to correctly display progress bars) ''' cursor = self.ui.edit_stdout.textCursor() cursor.clearSelection() splitted_lines = lines.split('\n') for idx, line in enumerate(splitted_lines): if '\r' in line: chunks = line.split('\r') overwrite_text(cursor, chunks[0]) # No going back for the first chunk for chunk in chunks[ 1:]: # Go back to start of line for each \r cursor.movePosition(QTextCursor.StartOfLine) overwrite_text(cursor, chunk) else: overwrite_text(cursor, line) # Take care to not introduce new newlines if '\n' in lines and (idx == 0 or idx != len(splitted_lines) - 1): cursor.movePosition(QTextCursor.EndOfLine) cursor.insertText('\n') self.ui.edit_stdout.setTextCursor(cursor) def append_output(self): if self.process is None: # Can happen when manually interrupting return lines = strip_ansi_codes(to_str(self.process.readAllStandardOutput())) self.add_output_lines(lines) # We manually deal with keyboard input in the output if 'Export already made! Do you want to erase everything? (y)es / (n)o' in lines: msg = QMessageBox() msg.setIcon(QMessageBox.Question) msg.setWindowTitle('Erase everything?') msg.setText( 'Export already made! Do you want to erase everything?') msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No) answer = msg.exec_() if answer == QMessageBox.Yes: answer_string = 'y' else: answer_string = 'n' elif 'Do you want SpyKING CIRCUS to export PCs? (a)ll / (s)ome / (n)o' in lines: msg = QMessageBox() msg.setIcon(QMessageBox.Question) msg.setWindowTitle('Export PCs?') msg.setText('Do you want SpyKING CIRCUS to export PCs?') no_button = msg.addButton('No', QMessageBox.NoRole) some_button = msg.addButton('Some', QMessageBox.YesRole) all_button = msg.addButton('All', QMessageBox.YesRole) msg.exec_() if msg.clickedButton() == no_button: answer_string = 'n' elif msg.clickedButton() == some_button: answer_string = 's' elif msg.clickedButton() == all_button: answer_string = 'a' else: answer_string = 'n' else: answer_string = '' if answer_string: self.process.write(answer_string + '\n') self.add_output_lines(answer_string + '\n') def append_error(self): if self.process is None: # Can happen when manually interrupting return lines = strip_ansi_codes(to_str(self.process.readAllStandardError())) self.add_output_lines(lines) def stop(self, force=False): if self.process is not None: if not force: msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setWindowTitle('Confirm process termination') msg.setText( 'This will terminate the running process. Are you sure ' 'you want to do this?') msg.setInformativeText( 'Interrupting the process may leave partly ' 'created files that cannot be used for ' 'further analysis.') msg.addButton('Stop process', QMessageBox.YesRole) cancel_button = msg.addButton('Cancel', QMessageBox.NoRole) msg.setDefaultButton(cancel_button) msg.exec_() if msg.clickedButton() == cancel_button: # Continue to run return self._interrupted = True # Terminate child processes as well pid = int(self.process.pid()) if sys.platform == 'win32' and pid != 0: # The returned value is not a PID but a pointer lp = ctypes.cast(pid, LPWinProcInfo) pid = lp.contents.dwProcessID if pid != 0: process = psutil.Process(pid) children = process.children(recursive=True) for proc in children: proc.terminate() gone, alive = psutil.wait_procs(children, timeout=3) for proc in alive: proc.kill() self.process.terminate() self.process = None def create_params_file(self, fname): msg = QMessageBox() msg.setIcon(QMessageBox.Question) msg.setText( "Parameter file %r not found, do you want SpyKING CIRCUS to " "create it for you?" % fname) msg.setWindowTitle("Generate parameter file?") msg.setInformativeText("This will create a parameter file from a " "template file and open it in your system's " "standard text editor. Fill properly before " "launching the code. See the documentation " "for details") msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No) answer = msg.exec_() if answer == QMessageBox.Yes: user_path = os.path.join(os.path.expanduser('~'), 'spyking-circus') if os.path.exists(user_path + 'config.params'): config_file = os.path.abspath(user_path + 'config.params') else: config_file = os.path.abspath( pkg_resources.resource_filename('circus', 'config.params')) shutil.copyfile(config_file, fname) QDesktopServices.openUrl(QUrl(fname)) def view_param(self): f_next, _ = os.path.splitext(str(self.ui.edit_file.text())) f_params = f_next + '.params' QDesktopServices.openUrl(QUrl(f_params)) def show_about(self): msg = QMessageBox() msg.setIcon(QMessageBox.Question) msg.setText("SpyKING CIRCUS v%s" % circus.__version__) msg.setWindowTitle("About") msg.setInformativeText("Documentation can be found at\n" "http://spyking-circus.rtfd.org\n" "\n" "Open a browser to see the online help?") msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No) msg.setDefaultButton(QMessageBox.No) answer = msg.exec_() if answer == QMessageBox.Yes: QDesktopServices.openUrl(QUrl("http://spyking-circus.rtfd.org")) def help_cpus(self): msg = QMessageBox() msg.setIcon(QMessageBox.Question) msg.setText("Setting the number of CPUs") msg.setWindowTitle("Number of CPUs") msg.setInformativeText("SpyKING CIRCUS can use several CPUs " "either locally or on multiple machines " "using MPI (see documentation) " "\n" "\n" "You have %d local CPUs available" % psutil.cpu_count()) msg.setStandardButtons(QMessageBox.Close) msg.setDefaultButton(QMessageBox.Close) answer = msg.exec_() def help_gpus(self): msg = QMessageBox() msg.setIcon(QMessageBox.Question) msg.setText("Setting the number of GPUs") msg.setWindowTitle("Number of GPUs") if not self.HAVE_CUDA: info = "No GPUs are detected on your system" else: gpu_id = 0 is_available = True while is_available: try: cmt.cuda_set_device(gpu_id) is_available = True except Exception: is_available = False info = "%d GPU is detected on your system" % (gpu_id + 1) msg.setInformativeText("SpyKING CIRCUS can use several GPUs\n" "either locally or on multiple machine\n" "using MPI (see documentation)" "\n" "\n" "%s" % info) msg.setStandardButtons(QMessageBox.Close) msg.setDefaultButton(QMessageBox.Close) answer = msg.exec_() def help_file_format(self): msg = QMessageBox() msg.setIcon(QMessageBox.Question) msg.setText("Supported file formats") msg.setWindowTitle("File formats") msg.setInformativeText("\n".join(list_all_file_format())) msg.setStandardButtons(QMessageBox.Close) msg.setDefaultButton(QMessageBox.Close) answer = msg.exec_() def open_plot_folder(self): f_next, _ = os.path.splitext(str(self.ui.edit_file.text())) plot_folder = os.path.join(f_next, 'plots') QDesktopServices.openUrl(QUrl(plot_folder)) def help_phy(self): QDesktopServices.openUrl( QUrl("https://github.com/kwikteam/phy-contrib")) def help_matlab(self): QDesktopServices.openUrl( QUrl("http://ch.mathworks.com/products/matlab/")) def closeEvent(self, event): if self.process is not None: msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setWindowTitle('Confirm process interruption') msg.setText( 'Closing the window will terminate the running process. ' 'Do you really want to exit?') msg.setInformativeText('Interrupting the process may leave partly ' 'created files that cannot be used for ' 'further analysis.') close_button = msg.addButton("Stop and close", QMessageBox.YesRole) cancel_button = msg.addButton("Cancel", QMessageBox.NoRole) msg.setDefaultButton(cancel_button) msg.exec_() if msg.clickedButton() == close_button: self.stop(force=True) super(LaunchGUI, self).closeEvent(event) else: event.ignore()
class CfdConsoleProcess: """ Class to run a console process asynchronously, printing output and errors to the FreeCAD console and allowing clean termination in Linux and Windows """ def __init__(self, finishedHook=None, stdoutHook=None, stderrHook=None): self.process = QProcess() self.finishedHook = finishedHook self.stdoutHook = stdoutHook self.stderrHook = stderrHook self.process.finished.connect(self.finished) self.process.readyReadStandardOutput.connect(self.readStdout) self.process.readyReadStandardError.connect(self.readStderr) self.print_next_error_lines = 0 self.print_next_error_file = False def __del__(self): self.terminate() def start(self, cmd, env_vars=None, working_dir=None): """ Start process and return immediately """ self.print_next_error_lines = 0 self.print_next_error_file = False env = QtCore.QProcessEnvironment.systemEnvironment() if env_vars: for key in env_vars: env.insert(key, env_vars[key]) self.process.setProcessEnvironment(env) if working_dir: self.process.setWorkingDirectory(working_dir) if platform.system() == "Windows": # Run through a wrapper process to allow clean termination cmd = [ os.path.join(FreeCAD.getHomePath(), "bin", "python.exe"), '-u', # Prevent python from buffering stdout os.path.join(os.path.dirname(__file__), "WindowsRunWrapper.py") ] + cmd print("Raw command: ", cmd) self.process.start(cmd[0], cmd[1:]) def terminate(self): if platform.system() == "Windows": # terminate() doesn't operate and kill() doesn't allow cleanup and leaves mpi processes running # Instead, instruct wrapper program to kill child process and itself cleanly with ctrl-break signal self.process.write(b"terminate\n") self.process.waitForBytesWritten() # 'flush' else: self.process.terminate() self.process.waitForFinished() def finished(self, exit_code): if self.finishedHook: self.finishedHook(exit_code) def readStdout(self): # Ensure only complete lines are passed on text = "" while self.process.canReadLine(): byteArr = self.process.readLine() text += QTextStream(byteArr).readAll() if text: print(text, end='') # Avoid displaying on FreeCAD status bar if self.stdoutHook: self.stdoutHook(text) # Must be at the end as it can cause re-entrance if FreeCAD.GuiUp: FreeCAD.Gui.updateGui() def readStderr(self): # Ensure only complete lines are passed on # Print any error output to console self.process.setReadChannel(QProcess.StandardError) text = "" while self.process.canReadLine(): byteArr = self.process.readLine() text += QTextStream(byteArr).readAll() if text: if self.stderrHook: self.stderrHook(text) FreeCAD.Console.PrintError(text) # Must be at the end as it can cause re-entrance if FreeCAD.GuiUp: FreeCAD.Gui.updateGui() self.process.setReadChannel(QProcess.StandardOutput) def state(self): return self.process.state() def waitForStarted(self): return self.process.waitForStarted() def waitForFinished(self): # For some reason waitForFinished doesn't always return - so we resort to a failsafe timeout: while True: ret = self.process.waitForFinished(1000) if self.process.error() != self.process.Timedout: self.readStdout() self.readStderr() return ret if self.process.state() == self.process.NotRunning: self.readStdout() self.readStderr() return True def exitCode(self): return self.process.exitCode() def processErrorOutput(self, err): """ Process standard error text output from OpenFOAM :param err: Standard error output, single or multiple lines :return: A message to be printed on console, or None """ ret = "" errlines = err.split('\n') for errline in errlines: if len(errline) > 0: # Ignore blanks if self.print_next_error_lines > 0: ret += errline + "\n" self.print_next_error_lines -= 1 if self.print_next_error_file and "file:" in errline: ret += errline + "\n" self.print_next_error_file = False words = errline.split(' ', 1) # Split off first field for parallel FATAL = "--> FOAM FATAL ERROR" FATALIO = "--> FOAM FATAL IO ERROR" if errline.startswith(FATAL) or (len(words) > 1 and words[1].startswith(FATAL)): self.print_next_error_lines = 1 ret += "OpenFOAM fatal error:\n" elif errline.startswith(FATALIO) or ( len(words) > 1 and words[1].startswith(FATALIO)): self.print_next_error_lines = 1 self.print_next_error_file = True ret += "OpenFOAM IO error:\n" if len(ret) > 0: return ret else: return None
def asn2dataModel(*files): ''' Call asn1DataModel, including the Makefile.python and return the imported module "name_of_dataview_asn.py" From this module it is possible to create native Asn1scc instances of ASN.1 data types, and to access to DV.py, which contains constants such as the _PRESENT fields for choice selectors ''' assert len(files) > 0 # 1) Create a temporary directory for the output tempdir = tempfile.mkdtemp() sys.path.insert(0, tempdir) # Use a unique name for the asn1 concatenated module concat_prefix = str(uuid.uuid4()).replace('-', '_') concat_path = os.path.join(tempdir, concat_prefix) # 2) Concat all input files to the output directory cat_bin = spawn.find_executable('cat') args = list(files) cat = QProcess() LOG.debug(os.getcwd()) LOG.debug(cat_bin + ' ' + ' '.join(args)) cat.start(cat_bin, args) merged = waitfor_qprocess(cat, 'Merge dataviews') with open(concat_path + '.asn', 'wt') as merged_file: merged_file.write(merged) # 3) Run asn2dataModel asn2dm_bin = spawn.find_executable('asn2dataModel') args = ['-toPython', '-o', tempdir, concat_path + '.asn'] asn2dm = QProcess() LOG.debug(os.getcwd()) LOG.debug(asn2dm_bin + ' ' + ' '.join(args)) asn2dm.start(asn2dm_bin, args) waitfor_qprocess(asn2dm, 'DMT tool "asn2dataModel"') # 4) call make -f Makefile.python to build the .so make_bin = spawn.find_executable('make') args = ['-f', 'Makefile.python'] make = QProcess() make.setWorkingDirectory(tempdir) LOG.debug(os.getcwd()) LOG.debug(make_bin + ' ' + ' '.join(args)) make.start(make_bin, args) waitfor_qprocess(make, 'make -f Makefile.python') if concat_prefix in ASN2DM.viewkeys(): # Re-import module if it was already loaded asn1mod = ASN2DM[concat_prefix] reload(asn1mod) reload(asn1mod.DV) import Stubs reload(Stubs) else: asn1mod = importlib.import_module(concat_prefix + '_asn') # force reload of modules in case of multiple calls reload(asn1mod.DV) import Stubs reload(Stubs) ASN2DM[concat_prefix] = asn1mod sys.path.pop(0) return asn1mod
def parse_asn1(*files, **options): ''' Call the ASN.1 parser on a number of files, and return the module containing the AST This function uses QProcess to launch the ASN.1 compiler because the subprocess module from Python has issues on the Windows platform ''' ast_version = options.get('ast_version', ASN1.UniqueEnumeratedNames) rename_policy = options.get('rename_policy', ASN1.NoRename) flags = options.get('flags', [ASN1.AstOnly]) pprint = options.get('pretty_print', False) assert isinstance(ast_version, ASN1) assert isinstance(rename_policy, ASN1) assert isinstance(flags, list) path_to_asn1scc = spawn.find_executable('asn1.exe') if not path_to_asn1scc: raise TypeError('ASN.1 Compiler not found in path') if os.name == 'posix': path_to_mono = spawn.find_executable('mono') if not path_to_mono: raise TypeErorr('"mono" not found in path. Please install it.') binary = path_to_mono arg0 = path_to_asn1scc else: binary = path_to_asn1scc arg0 = '' asn1scc_root = os.path.abspath(os.path.dirname(path_to_asn1scc)) # Create a temporary directory to store dataview.py and import it tempdir = tempfile.mkdtemp() sys.path.append(tempdir) if os.name == 'nt': # On windows, remove the drive letter, workaround to ASN1SCC bug tempdir = tempdir[2:] asn1scc_root = asn1scc_root[2:] filename = str(uuid.uuid4()).replace('-', '_') filepath = tempdir + os.sep + filename + '.py' stg = asn1scc_root + os.sep + 'python.stg' if pprint: # Generate an html file with pretty-printed ASN.1 types stg_qrc = QFile(':misc/pretty_print_asn1.stg') stg_qrc.open(1) content = stg_qrc.readAll() stgfile = tempdir + os.sep + 'pretty_print_asn1.stg' with open(stgfile, 'w') as tmpfile: tmpfile.write(content.data()) out_html = tempdir + os.sep + 'dataview.html' html = ['-customIcdUper', stgfile + '::' + out_html] else: html = [] args = [ arg0, '-customStgAstVerion', str(ast_version.value), '-customStg', stg + '::' + filepath, '-renamePolicy', str(rename_policy.value) ] + html + list(*files) asn1scc = QProcess() LOG.debug(os.getcwd()) LOG.debug(binary + ' ' + ' '.join(args)) asn1scc.start(binary, args) _ = waitfor_qprocess(asn1scc, "ASN.1 Compiler") if filename in AST.viewkeys(): # Re-import module if it was already loaded ast = AST[filename] reload(ast) else: ast = importlib.import_module(filename) AST[filename] = ast if pprint: # add the path to the optionally-gernated pretty-printed HTML file ast.html = out_html return ast