py/pyext - python script objects for PD and Max/MSP Copyright (c)2002-2005 Thomas Grill (gr@grrrr.org) For information on usage and redistribution, and for a DISCLAIMER OF ALL WARRANTIES, see the file, "license.txt," in this distribution. Donations for further development of the package are highly appreciated. Visit https://www.paypal.com/xclick/business=gr%40grrrr.org&item_name=pyext&no_note=1&tax=0¤cy_code=EUR ---------------------------------------------------------------------------- You will need the flext C++ layer for PD and Max/MSP externals to compile this. see http://grrrr.org/ext/flext ---------------------------------------------------------------------------- Goals/features of the package: Access the flexibility of the python language in PD and MaxMSP PD - Load it as i library with e.g. "pd -lib py -path scripts" Check out the sample patches and scripts Description: With the py object you can load python modules and execute the functions therein. With the pyext you can use python classes to represent full-featured pd/Max message objects. Multithreading (detached methods) is supported for both objects. You can send messages to named objects or receive (with pyext) with Python methods. Known bugs: - The TCL/TK help patch is not usable under OSX. - With standard PD 0.37, threaded py scripts will cause "Stack overflows" under some circumstances -> use PD 0.38 or the devel_0_37 cvs branch instead ---------------------------------------------------------------------------- The py/pyext package should run with Python version >= 2.1. It has been thoroughly tested with versions 2.2 to 2.4 ---------------------------------------------------------------------------- Version history: 0.2.0: - ADD: handling of Python threads - FIX: output of single atoms instead of 1-element lists - ADD: new detach mechanism (call queue) - ADD: support for Max/MSP @ OSX and Windows - DEL: eliminated meaningless inchannels and outchannels methods - ADD: enabled "int"-tags for pyext class functions - ADD: py: when no function is given on the command line, let it be selected by message tag - FIX: __init__ wasn't called on reload - FIX: bound instance methods weren't correctly decref'd - ADD: Python symbol type 0.1.4: - ADD: better (and independent) handling of inlet and outlet count (as class variables or dynamically initialized in __init__) - FIX: many memory leaks associated to ***GetItem stuff (big thanks to sven!) - FIX: set "this" memory in object after reloading script - ADD: _getvalue,_setvalue to access PD values - FIX: don't shout when Python script returns PyNone - ADD: alias creation names pyext. and pyx. take the script name also for the class name 0.1.3: - FIX: class variables are now set atomic if parameter list has only 1 element - ADD: introduced shortcut "pyx" for pyext. - ADD: arguments to the pyext class are now exposed as attributes "args" - FIX: parameters to Python functions are treated as integers when they can be. - ADD: inlet and outlet count can be given for pyext, python _inlet and _outlet members are ignored then - FIX: crash if script or class names are non-strings - FIX: long multi-line doc strings are now printed correctly - FIX: message "doc+" for class/instance __doc__ now working - FIX: improved/debugged handling of reference counts - FIX: _pyext._send will now send anythings if feasible - CHANGE: no more finalization - it's really not necessary... - FIX: calling from unregistered threads (like flext helper thread) now works 0.1.2: - CHANGE: updates for flext 0.4.1 - method registering within class scope - FIX: bugs in bound.cpp (object_free calls) - FIX: bug with threaded methods along with flext bug fix. - ADD: map Python threads to system threads - ADD: shut down the Python interpreter appropriately - CHANGE: use flext timer and bind functionality - ADD: attribute functionality - ADD: dir and dir+ methods for Python dictionary listing - ADD: get and set methods for Python class attributes 0.1.1: - CHANGE: updates for flext 0.4.0 - FIX: crash when module couldn't be loaded - FIX: GetBound method (modmeth.cpp, line 138) doesn't exist in flext any more - FIX: deadlock occured when connecting to py/pyext boxes in non-detached mode - ADD: current path and path of the canvas is added to the python path - FIX: path is not added to python path if already included 0.1.0: - completely reworked all code - added class functionality for full-featured objects and renamed the merge to pyext - enabled threads and made everything thread-safe ... phew! - using flext 0.3.2 - pyext now gets full python path - python's argv[0] is now "py" or "pyext" - etc.etc. 0.0.2: - fixed bug when calling script with no function defined (thanks to Ben Saylor) - cleaner gcc makefile 0.0.1: - using flext 0.2.1 --------------------------------------------------------------------------- TODO list: general: - Documentation and better example patches - better error reporting for runtime errors features: - enable multiple interpreters? ( -> not possible within one thread) - stop individual threads - support named (keyword) arguments (like attributes for messages) - shutdown hook for threaded Python apps tests: - check for python threading support