Spawn the server from the register
function, not inside ServerPanel.draw
:
import multiprocessing as mp
import socket
import sys
import bpy
import time
import threading
from xmlrpc.server import SimpleXMLRPCServer
import xmlrpc.client
bl_info = {
"name": "XMLRPC Server",
"author": "KristenH",
"version": (0, 5, 0, 1),
"blender": (2, 79, 0),
"category": "System"
}
HOST = 'localhost'
PORT = 8000
class SimpleServer(SimpleXMLRPCServer):
pass
def command(com):
com = 'import bpy\n'+com
exec(com)
return com
def server_data():
return bpy.app.version_string, bpy.context.blend_data.filepath, socket.gethostname()
class ServerPanel(bpy.types.Panel):
bl_label = "Server Panel"
bl_idname = "Object_PT_server"
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_category = "Shortcuts"
proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
def draw(self, context):
layout = self.layout
version_string, filepath, hostname = self.proxy.server_data()
print('found server on', 'localhost:', hostname)
layout.row().label(text="Server found on: {}:{}".format(hostname,PORT))
layout.row().label(text="Press Ctrl-C in terminal to exit".format(hostname,PORT))
def register():
global thread
proc = mp.Process(target=maybe_launch_server)
proc.daemon = True
proc.start()
bpy.utils.register_class(ServerPanel)
def unregister():
bpy.utils.unregister_class(ServerPanel)
def maybe_launch_server():
proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
try:
result = proxy.server_data()
except ConnectionRefusedError:
server = SimpleServer((HOST, PORT))
server.register_introspection_functions()
server.register_function(command, "command")
server.register_function(server_data, "server_data")
version_string = bpy.app.version_string
print("Started the server with:", HOST, ":", PORT)
server.serve_forever()
if __name__ == "__main__":
register()
This spawns the server as a separate process. proc.daemon = True
causes the process to terminate when the calling process terminates. That means that whatever blender starts the server is the "main" process, and when it terminates, so does the server.