[Pythonmac-SIG] PyObjC vs "old school" embedding
Bob Ippolito
bob at redivi.com
Tue May 31 23:54:10 CEST 2005
On May 31, 2005, at 2:36 PM, gandreas at gandreas.com wrote:
>
> On May 31, 2005, at 3:51 PM, Bob Ippolito wrote:
>
>
>>
>> On May 31, 2005, at 1:17 PM, gandreas at gandreas.com wrote:
>>
>>
>>
>>> So PyOXIDE is based on the traditional way to embed python in an
>>> application (explicitly calling the python APIs to access and
>>> call stuff), and this worked reasonably well. For example, it
>>> runs various scripts at startup, which register various callbacks
>>> to handle things like new documents, new interactives, etc...
>>> (and then the underlying Objective C code explicitly calls these
>>> callbacks at appropriate points).
>>>
>>>
>>
>> I would just throw this stuff away and take advantage of what
>> PyObjC can (and has always been able to) do for you. Digging at
>> the Python API is hard to get right, and is a LOT more code, as
>> you've shown.
>>
>
> Yes, it's trickier to get all the details correct on embedding, but
> yes, I've done it before (more times than I care to admit) so it
> wasn't that big of a deal. However, the current release of PyObjC
> appears to change the semantics of that - what the current
> interpreter state is when getting called back has changed, so it is
> no longer possible to explicitly call further Python code via the
> embedding API from native code called over the PyObjC bridge.
It hasn't really changed, you just weren't managing the interpreter
state correctly.
>> Somewhere in PyOXIDE you're not managing interpreter state
>> correctly, probably not in the code you've pasted, I don't have
>> time to look into it...
>>
>
> Obviously you've got next week's session to get prepared for, but
> there is no code for managing the interpreter state to be wrong,
> since there isn't any (and without any threading, there shouldn't
> be the need for any - and this case is entirely threading free).
Actually, there is. Look at:
<http://svn.red-bean.com/bob/py2app/trunk/src/py2app/bundletemplate/
src/main.m>
>> but I HIGHLY RECOMMEND that you throw away all your Python C API
>> code and use a PyObjC-based bundle instead, which will take care
>> of managing interpreter state and such for you at message dispatch
>> boundaries.
>
> It's just not practical at this time to "throw away all my Python C
> API code" and refactor the application to be a PyObjC based bundle,
> and frankly, I don't consider this a practical answer anyway.
> Saying "yes, you can embed python and PyObjC but you really want to
> throw things around and have your application embedded as a PyObjC
> based bundle" seems to be a limiting answer. There's lots of
> scripting languages that can be embedded with various levels of
> language bridges - Python (PyObjC), Perl (CamelBones), JavaScript
> (WebKit), Lua (LuaObjective-C), Ruby (RubyCocoa) etc... and as near
> as I know, PyObjC is the only one that requires this "embed your
> app" approach.
PyObjC-based bundle meaning -- PyObjC-based *plugin* MH_BUNDLE!!
I didn't say rewrite the shell of your app.
> PyObjC and the whole py2app is a _great_ way to take python scripts
> and turn them into an application - don't get me wrong, I'm not say
> this isn't really slick and amazing with how well it works, but
> this doesn't seem like a good approach to embedding Python in an
> existing application. Compare it with how to use Javascript via
> WebKit - yes, it's no where near as flexible/automatic as PyObjC,
> (and you can't mix and match inheritance!) but in the end, if you
> want to embed a scripting language to extend your application,
> Javascript via Webkit is probably a better solution than PyObjC
> (which is a real shame).
If you say so..
-bob
More information about the Pythonmac-SIG
mailing list