<html><body><div><br><br>On 02 Jul, 2010,at 03:14 PM, Georg Seifert &lt;georg.seifert@gmx.de&gt; wrote:<br><br></div><div><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; " _mce_style="word-wrap: break-word;">Hi,<div><br></div><div>I have problems getting plugins made in python (made with py2app) to play with my app.</div><div><br></div><div>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&nbsp;PyRun_SimpleString). If I have a plugin loaded (it works) but it crashes on running the scripts.</div><div><br></div><div>I make the plugin the the -A option to keep them small (16MB per plugin is too much)</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre" _mce_style="white-space: pre;">        python setup.py py2app -A</span></div><div><span class="Apple-tab-span" style="white-space:pre" _mce_style="white-space: pre;"><br></span></div><div>If I then run this it crashes on "<span class="Apple-style-span" style="color: rgb(120, 73, 42); font-family: 'OliveGreen Mono'; font-size: 13px; " _mce_style="color: #78492a; font-family: 'OliveGreen Mono'; font-size: 13px;">PyRun_SimpleString"</span>:</div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(61, 30, 129); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #3d1e81; margin: 0px;"><font class="Apple-style-span" color="#000000">&nbsp;&nbsp; &nbsp;</font>Py_Initialize<span style="color: #000000" _mce_style="color: #000000;">();</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(186, 45, 162); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #ba2da2; margin: 0px;"><font class="Apple-style-span" color="#000000">&nbsp;&nbsp; &nbsp;</font><span class="Apple-style-span" style="color: rgb(120, 73, 42); " _mce_style="color: #78492a;">PyRun_SimpleString<span style="color: #000000" _mce_style="color: #000000;">(</span><span style="color: #d12e1b" _mce_style="color: #d12e1b;">"print \"Test\"\n"</span><span style="color: #000000" _mce_style="color: #000000;">);</span></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(186, 45, 162); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #ba2da2; margin: 0px;"><font class="Apple-style-span" color="#000000">&nbsp;&nbsp; &nbsp;</font><span class="Apple-style-span" style="color: rgb(61, 30, 129); " _mce_style="color: #3d1e81;">Py_Finalize</span><span class="Apple-style-span" style="color: rgb(61, 30, 129); font-family: 'OliveGreen Mono'; font-size: 13px; " _mce_style="color: #3d1e81; font-family: 'OliveGreen Mono'; font-size: 13px;"><span style="color: rgb(0, 0, 0); " _mce_style="color: #000000;">();</span></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(120, 73, 42); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #78492a; margin: 0px;"><font class="Apple-style-span" color="#000000" face="'Azur Sans i'"><span class="Apple-style-span" style="font-size: medium;" _mce_style="font-size: medium;"><font class="Apple-style-span" face="'OliveGreen Mono'" size="3"><span class="Apple-style-span" style="font-size: 13px;" _mce_style="font-size: 13px;"><br></span></font></span></font></div></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(120, 73, 42); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #78492a; margin: 0px;"><font class="Apple-style-span" color="#000000" face="'Azur Sans i'"><span class="Apple-style-span" style="font-size: medium;" _mce_style="font-size: medium;"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; margin: 0px;"><font class="Apple-style-span" face="'Azur Sans i'"><span class="Apple-style-span" style="font-size: medium;" _mce_style="font-size: medium;">In my app, I week link to python through</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; margin: 0px;"><font class="Apple-style-span" face="'Azur Sans i'"><span class="Apple-style-span" style="font-size: medium;" _mce_style="font-size: medium;"><span class="Apple-tab-span" style="white-space:pre" _mce_style="white-space: pre;">        </span></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; margin: 0px;"><font class="Apple-style-span" face="'Azur Sans i'"><span class="Apple-style-span" style="white-space: pre; font-size: medium;" _mce_style="white-space: pre; font-size: medium;"><span class="Apple-tab-span" style="white-space:pre" _mce_style="white-space: pre;">        </span>OTHER_LDFLAGS = -weak_framework Python<br>(This was needed to support both Leopard and Snow Leopard.)</span></font></div><div><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; margin: 0px;"><font class="Apple-style-span" face="'Azur Sans i'"><span class="Apple-style-span" style="font-size: medium; " _mce_style="font-size: medium;">Can anyone shed some light on my problem?</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; margin: 0px;"><font class="Apple-style-span" face="'Azur Sans i'"><span class="Apple-style-span" style="font-size: medium; " _mce_style="font-size: medium;"><br></span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; margin: 0px;"><font class="Apple-style-span" face="'Azur Sans i'"><span class="Apple-style-span" style="font-size: medium; " _mce_style="font-size: medium;">Best Regards</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; margin: 0px;"><font class="Apple-style-span" face="'Azur Sans i'"><span class="Apple-style-span" style="font-size: medium; " _mce_style="font-size: medium;">Georg Seifert</span></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; margin: 0px;"><font class="Apple-style-span" face="'Azur Sans i'"><span class="Apple-style-span" style="font-size: medium; " _mce_style="font-size: medium;"><br></span></font></div></span></font></div><div class="_stretch">_______________________________________________<br>
Pythonmac-SIG maillist  -  Pythonmac-SIG@python.org<br>
<a href="http://mail.pythonorg/mailman/listinfo/pythonmac-sig" _mce_href="http://mail.python.org/mailman/listinfo/pythonmac-sig">http://mail.python.org/mailman/listinfo/pythonmac-sig</a><br>
unsubscribe: <a href="http://mail.python.org/mailman/options/Pythonmac-SIG" _mce_href="http://mail.python.org/mailman/options/Pythonmac-SIG">http://mail.python.org/mailman/options/Pythonmac-SIG</a><br>
</div></div></blockquote></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(186, 45, 162); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #ba2da2; margin: 0px;"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; " _mce_style="word-wrap: break-word;"><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(186, 45, 162); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #ba2da2; margin: 0px;"><font class="Apple-style-span" color="#000000"><br></font></div></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(186, 45, 162); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #ba2da2; margin: 0px;"><font class="Apple-style-span" color="#000000">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. &nbsp; &nbsp;It is better to call Py_Initialize during program start and Py_Finalize during shutdown (to ensure that python finalizers are called).</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(186, 45, 162); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #ba2da2; margin: 0px;"><font class="Apple-style-span" color="#000000"><br></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(186, 45, 162); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #ba2da2; margin: 0px;"><font class="Apple-style-span" color="#000000">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.</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(186, 45, 162); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #ba2da2; margin: 0px;"><font class="Apple-style-span" color="#000000"><br></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(186, 45, 162); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #ba2da2; margin: 0px;"><font class="Apple-style-span" color="#000000">You will have to ensure that your code acquires the GIL before calling Python APIs. The easiest way to do that is:</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(186, 45, 162); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #ba2da2; margin: 0px;"><font class="Apple-style-span" color="#000000"><br></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(186, 45, 162); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #ba2da2; margin: 0px;"><font class="Apple-style-span" color="#000000"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(186, 45, 162); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #ba2da2; margin: 0px;">&nbsp;&nbsp; &nbsp;<span style="color: rgb(0, 0, 0); ">PyGILState_STATE gilState = PyGILState_Ensure();</span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(186, 45, 162); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #ba2da2; margin: 0px;"><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp; &nbsp;P<span class="Apple-style-span">yRun_SimpleString("print \"Test\"\n");</span></span></div><div><div><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp; &nbsp;PyGILState_Release(gilState);</span></div></div><div><br></div></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(186, 45, 162); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #ba2da2; margin: 0px;"><font class="Apple-style-span" color="#000000">Ronald</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(186, 45, 162); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #ba2da2; margin: 0px;"><font class="Apple-style-span" color="#000000"><br></font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 13px/normal 'OliveGreen Mono'; color: rgb(186, 45, 162); " _mce_style="font: normal normal normal 13px/normal 'OliveGreen Mono'; color: #ba2da2; margin: 0px;"><font class="Apple-style-span" color="#000000">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. &nbsp; Threads running Python code will periodicly release and reacquire the GIL to ensure that all such threads can make progress.</font></div></div></div></body></html>