Last active
May 17, 2025 10:41
-
-
Save minimalefforttech/0e34db7856d5092f632bcd9eae5e1ca7 to your computer and use it in GitHub Desktop.
A PySide connector to go with the blender vscode port: https://github.com/minimalefforttech/vscode_blender_port
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # Copyright (c) 2025, Alex Telford. All rights reserved. | |
| try: | |
| from PySide6 import QtCore, QtNetwork | |
| except ImportError: | |
| from PySide2 import QtCore, QtNetwork | |
| import sys | |
| import io | |
| GLOBALS = {} | |
| def execute_code(code): | |
| old_stdout = sys.stdout | |
| old_stderr = sys.stderr | |
| sys.stdout = io.StringIO() | |
| sys.stderr = io.StringIO() | |
| try: | |
| exec(code, GLOBALS) | |
| output = sys.stdout.getvalue() + sys.stderr.getvalue() | |
| except Exception as e: | |
| output = sys.stdout.getvalue() + sys.stderr.getvalue() | |
| output += f"\n[PythonCommandServer] Exception: {e}" | |
| finally: | |
| sys.stdout = old_stdout | |
| sys.stderr = old_stderr | |
| return output | |
| class PythonCommandServer(QtCore.QObject): | |
| def __init__(self, port=8080, parent=None): | |
| super().__init__(parent) | |
| # You could prob put this in a start() slot... | |
| self._server = QtNetwork.QTcpServer(self) | |
| self._server.newConnection.connect(self._on_new_connection) | |
| self._socket = None | |
| self._server.listen(QtNetwork.QHostAddress.LocalHost, port) | |
| @QtCore.Slot() | |
| def _on_new_connection(self): | |
| if self._socket: | |
| self._socket.disconnectFromHost() | |
| self._socket = self._server.nextPendingConnection() | |
| self._socket.readyRead.connect(self._on_ready_read) | |
| @QtCore.Slot() | |
| def _on_ready_read(self): | |
| if self._socket.bytesAvailable() < 8: | |
| return | |
| length_header = self._socket.peek(8).data() | |
| expected_len = int(length_header.decode()) | |
| total_message_size = 8 + expected_len | |
| if self._socket.bytesAvailable() < total_message_size: | |
| # data is still being sent. | |
| return | |
| self._socket.read(8) # Discard the length header | |
| code = self._socket.read(expected_len).data().decode() | |
| output = execute_code(code) | |
| self._send_output(output) | |
| def _send_output(self, output): | |
| data = output.encode("utf-8") | |
| length_header = str(len(data)).zfill(8).encode("utf-8") | |
| self._socket.write(length_header + data) | |
| # Initialize the local server that vscode will connect to | |
| server = PythonCommandServer(port=8080) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment