Skip to content

Instantly share code, notes, and snippets.

@minimalefforttech
Last active May 17, 2025 10:41
Show Gist options
  • Select an option

  • Save minimalefforttech/0e34db7856d5092f632bcd9eae5e1ca7 to your computer and use it in GitHub Desktop.

Select an option

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
# 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