tFix multiline script error (#6581) - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 77287e0fc7d9b4783c820543b3bf1910c47189d3 DIR parent 35f1f2905b79550fe062fe9db8ec1fa160eda121 HTML Author: BenoƮt Verret <verret.benoit@gmail.com> Date: Tue, 15 Sep 2020 13:23:22 -0400 Fix multiline script error (#6581) Syntax errors emerged when running multiline scripts in the console when using the run() command. Diffstat: M electrum/gui/qt/console.py | 100 +++++++++++++++---------------- 1 file changed, 49 insertions(+), 51 deletions(-) --- DIR diff --git a/electrum/gui/qt/console.py b/electrum/gui/qt/console.py t@@ -80,10 +80,7 @@ class Console(QtWidgets.QPlainTextEdit): with open(filename) as f: script = f.read() - # eval is generally considered bad practice. use it wisely! - result = eval(script, self.namespace, self.namespace) - - + self.exec_command(script) def updateNamespace(self, namespace): self.namespace.update(namespace) t@@ -205,61 +202,62 @@ class Console(QtWidgets.QPlainTextEdit): for i in range(len(self.prompt) + position): self.moveCursor(QtGui.QTextCursor.Right) - def runCommand(self): + def run_command(self): command = self.getCommand() self.addToHistory(command) command = self.getConstruct(command) if command: - tmp_stdout = sys.stdout - - class stdoutProxy(): - def __init__(self, write_func): - self.write_func = write_func - self.skip = False - - def flush(self): - pass - - def write(self, text): - if not self.skip: - stripped_text = text.rstrip('\n') - self.write_func(stripped_text) - QtCore.QCoreApplication.processEvents() - self.skip = not self.skip - - if type(self.namespace.get(command)) == type(lambda:None): - self.appendPlainText("'{}' is a function. Type '{}()' to use it in the Python console." - .format(command, command)) - self.newPrompt('') - return - - sys.stdout = stdoutProxy(self.appendPlainText) - try: - try: - # eval is generally considered bad practice. use it wisely! - result = eval(command, self.namespace, self.namespace) - if result is not None: - if self.is_json: - util.print_msg(util.json_encode(result)) - else: - self.appendPlainText(repr(result)) - except SyntaxError: - # exec is generally considered bad practice. use it wisely! - exec(command, self.namespace, self.namespace) - except SystemExit: - self.close() - except BaseException: - traceback_lines = traceback.format_exc().split('\n') - # Remove traceback mentioning this file, and a linebreak - for i in (3,2,1,-1): - traceback_lines.pop(i) - self.appendPlainText('\n'.join(traceback_lines)) - sys.stdout = tmp_stdout + self.exec_command(command) self.newPrompt('') self.set_json(False) + def exec_command(self, command): + tmp_stdout = sys.stdout + + class stdoutProxy(): + def __init__(self, write_func): + self.write_func = write_func + self.skip = False + + def flush(self): + pass + + def write(self, text): + if not self.skip: + stripped_text = text.rstrip('\n') + self.write_func(stripped_text) + QtCore.QCoreApplication.processEvents() + self.skip = not self.skip + + if type(self.namespace.get(command)) == type(lambda:None): + self.appendPlainText("'{}' is a function. Type '{}()' to use it in the Python console." + .format(command, command)) + return + + sys.stdout = stdoutProxy(self.appendPlainText) + try: + try: + # eval is generally considered bad practice. use it wisely! + result = eval(command, self.namespace, self.namespace) + if result is not None: + if self.is_json: + util.print_msg(util.json_encode(result)) + else: + self.appendPlainText(repr(result)) + except SyntaxError: + # exec is generally considered bad practice. use it wisely! + exec(command, self.namespace, self.namespace) + except SystemExit: + self.close() + except BaseException: + traceback_lines = traceback.format_exc().split('\n') + # Remove traceback mentioning this file, and a linebreak + for i in (3,2,1,-1): + traceback_lines.pop(i) + self.appendPlainText('\n'.join(traceback_lines)) + sys.stdout = tmp_stdout def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Tab: t@@ -269,7 +267,7 @@ class Console(QtWidgets.QPlainTextEdit): self.hide_completions() if event.key() in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return): - self.runCommand() + self.run_command() return if event.key() == QtCore.Qt.Key_Home: self.setCursorPosition(0)