[PD-dev] pyext crash
Thomas Grill
gr at grrrr.org
Tue Sep 20 22:32:01 CEST 2005
Hi Georg,
seems i incidentally stumbled across the bug...
> when I try to call the method "trigger" from an other program, PD
> always is crashing with the following backtrace:
>
> I gues I am using something in a wrong way, but if I don't try to send
> the number to the outlet (line 31 in xmlrpc_server.py) there is no
> crash (e.g. a simple print in python works fine ...)
># ================================================
># PDxmlrpc class
>class PDxmlrpc(pyext._class):
> """ xmlrpc server """
>
> # define in, outlets
> _inlets=1
> _outlets=1
>
> # start server
> def start_server_1(self, port):
> s = AsyncServer(port)
> s.start()
>
> # trigger a specific number and
> # put it out to pd
> def trigger(self, number):
> self._outlet(1,number)
>
># ======================================================================
># xmlrpc server
>class AsyncServer(threading.Thread):
> """Starts the xmlrpc-server asynchron"""
> def __init__(self, port):
> threading.Thread.__init__(self)
> self.port = port
> def run(self):
> self.server = SimpleXMLRPCServer(("localhost", self.port))
> self.server.register_instance(PDxmlrpc())
>
>
the problem is that in the last line you are creating a new instance of the PDxmlrpc class, although you want to output data over the one you created with the pyext object (which represents a PD external).
You'd rather have to store and use a reference to your existing object, like in the following.
(also xmlrpc wants to have non-None return values from the methods)
The basic problem with that is that you create a circular reference which e.g. inhibits reloading of modules with pyext etc. This might not be a problem for you though, letting the server run forever.
# ================================================
# py script for pure data
#
"""scripts to get messages from a xmlrpc server"""
#
# (c) 2005, Georg Holzmann, <grh at mur.at>
# ================================================
# ================================================
# imports
import pyext, SimpleXMLRPCServer, threading
from SimpleXMLRPCServer import SimpleXMLRPCServer
# ================================================
# PDxmlrpc class
class PDxmlrpc(pyext._class):
""" xmlrpc server """
# define in, outlets
_inlets=1
_outlets=1
# start server
def start_server_1(self, port):
s = AsyncServer(port,self)
s.start()
# trigger a specific number and
# put it out to pd
def trigger(self, number):
self._outlet(1,number)
return True
# ======================================================================
# xmlrpc server
class AsyncServer(threading.Thread):
"""Starts the xmlrpc-server asynchron"""
def __init__(self, port,inst):
threading.Thread.__init__(self)
self.port = port
self.inst = inst
def run(self):
self.server = SimpleXMLRPCServer(("localhost", self.port))
self.server.register_instance(self.inst)
print "xmlrpc server serving on port ", self.port
self.server.serve_forever()
# EOF
# ======================================================================
More information about the Pd-dev
mailing list