To use IPython shell from Grok based project is easy, just add ipython to eggs directive in your buildout.cfg
My part with ipython added looks like this:
[app] recipe = zc.recipe.egg eggs = grok-awesome ipython Paste PasteScript PasteDeploy interpreter = python-console
But I wanted to be able to inspect Grok instance and use path TAB auto-completion to navigate ZODB hierarchy.
Inspired by existing IPython profile fo Zope2 I whipped out basic implementation for Grok.
It’s available under grok-ipython. Now all IPython power can be used when inspecting objects in Grok instance:
(mygrok)[alienoid@capricorn grok-awesome]$ bin/ipython -p grok IPython shell for Grok. Bound object names: ------------------- root ctx Bound command names: -------------------- cdg / ;cdg lsg / ;lsg pwdg sync commit Grok IPython 0.9.1 Py 2.5.2 In [1]: root Out[1]: <zope.app.folder.folder.Folder object at 0x9003e6c> In [2]: ctx Out[2]: <zope.app.folder.folder.Folder object at 0x9003e6c> In [3]: ;cdg blog ------> cdg("blog") Out[3]: u'/blog' In [4]: ctx Out[4]: <grokawesome.blog.Blog object at 0x81d2d6c> In [5]: ;cdg my-first-post second-post In [5]: ;cdg my-first-post ------> cdg("my-first-post") Out[5]: u'/blog/my-first-post' In [6]: ctx Out[6]: <grokawesome.entry.BlogEntry object at 0xb7d556ac> In [7]: pwdg Out[7]: u'/blog/my-first-post' In [8]: ctx? Type: BlogEntry Base Class: <class 'grokawesome.entry.BlogEntry'> String Form: <grokawesome.entry.BlogEntry object at 0xb7d556ac> Namespace: Interactive Length: 0 File: /home/alienoid/mygrok/grok-awesome/src/grokawesome/entry.py Docstring: <no docstring> In [9]: ctx?? Type: BlogEntry Base Class: <class 'grokawesome.entry.BlogEntry'> String Form: <grokawesome.entry.BlogEntry object at 0xb7d556ac> Namespace: Interactive Length: 0 File: /home/alienoid/mygrok/grok-awesome/src/grokawesome/entry.py Source: class BlogEntry(grok.Container): grok.implements(IBlogEntry) portal_type = 'blogentry' created = property.DCProperty('created') modified = property.DCProperty('modified') def __init__(self, title, content, summary=u'', categories=None, allow_comments=False): super(BlogEntry, self).__init__() self.title = title self.content = content self.summary = '' if summary is None else summary self.categories = [] if categories is None else categories self.allow_comments = allow_comments
If you enjoyed this post why not subscribe via email or my RSS feed and get the latest updates immediately.
You can also follow me on GitHub or Twitter.



{ 3 comments… read them below or add one }
This is really nice! Thank you for working this out.
I am learning Grok and rather new to IPython, so this would have taken me a long time to figure out myself.
I don’t know how many other Grok developers use IPython, but would you consider adding your profile and readme to the Community Grok Documentation in the form of a short how-to?
If you would rather not, could you at least announce this on the Grok-Dev mailing list with a link to your blog?
Thanks again,
Steve
Hi,
thank you for sharing. Unfortunately the link is dead. What happened to grok-ipython?
Kind Regards
Dominik
I stopped working with Grok, but the package is available. Let me know if you need it – I’ll send it to you.