Hi,
Thanks a lot. This did the trick.
By the way. Is it save to use the "-A" option in my bundles if I ship the
plugin to uses?
Many Thanks
Georg Seifert
p.s. You can have a look at the app (it is an open BETA version)
www.glyphsapp.com
>
>> Hi,
>>
>> I have problems getting plugins made in python (made with py2app) to play
>> with my app.
>>
>> My app needs to do two things: load plugins (bundles, mostly written in ObjC
>> but also in python) and run scripts from within the app (uses
>> PyRun_SimpleString). If I have a plugin loaded (it works) but it crashes on
>> running the scripts.
>>
>> I make the plugin the the -A option to keep them small (16MB per plugin is
>> too much)
>>
>> python setup.py py2app -A
>>
>> If I then run this it crashes on "PyRun_SimpleString":
>> Py_Initialize();
>> PyRun_SimpleString("print \"Test\"\n");
>> Py_Finalize();
>>
>> In my app, I week link to python through
>>
>> OTHER_LDFLAGS = -weak_framework Python
>> (This was needed to support both Leopard and Snow Leopard.)
>>
>> Can anyone shed some light on my problem?
>>
>> Best Regards
>> Georg Seifert
>>
>> _______________________________________________
>> Pythonmac-SIG maillist - [email protected]
>> http://mail.python.org/mailman/listinfo/pythonmac-sig
>> unsubscribe: http://mail.python.org/mailman/options/Pythonmac-SIG
>
>
> First of all: don't use Py_Initialize and Py_Finalize around the calls to to
> PyRun_SimpleString, the call to Py_Finalize will clean up resources that are
> used by the Python plugins. It is better to call Py_Initialize during
> program start and Py_Finalize during shutdown (to ensure that python
> finalizers are called).
>
> That is not what's causing your problem though. The C code in plugin bundles
> created using py2app ensures that Python is initialized and then runs the
> main module of the bundle. It then ensures that the Python GIL is released,
> which is needed to ensure that callbacks to Python code can happen on any
> thread.
>
> You will have to ensure that your code acquires the GIL before calling Python
> APIs. The easiest way to do that is:
>
> PyGILState_STATE gilState = PyGILState_Ensure();
> PyRun_SimpleString("print \"Test\"\n");
> PyGILState_Release(gilState);
>
> Ronald
>
> P.S. As background: the GIL is the Global Interpreter Lock and is a lock that
> ensures that at most 1 C thread at a time is actively executing Python code.
> Threads running Python code will periodicly release and reacquire the GIL to
> ensure that all such threads can make progress.
_______________________________________________
Pythonmac-SIG maillist - [email protected]
http://mail.python.org/mailman/listinfo/pythonmac-sig
unsubscribe: http://mail.python.org/mailman/options/Pythonmac-SIG