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 - Pythonmac-SIG@python.org
>> 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  -  Pythonmac-SIG@python.org
http://mail.python.org/mailman/listinfo/pythonmac-sig
unsubscribe: http://mail.python.org/mailman/options/Pythonmac-SIG

Reply via email to