[Bf-python] Integrating IPython with blender

Gabriel Elkind gwelkind at wesleyan.edu
Sun Sep 15 21:01:31 CEST 2013


Hello!

I am still getting familiar with blender's backend. In all other coding I
do with python, I use IPython <http://ipython.org/index.html>, which allows
me to log all input and output, issue bash commands quickly and simply,
query docstrings and sourcecode of functions within the interpreter and use
a robust tab completion. I have been searching for a way to integrate
blender and ipython for about a week now and running into many roadblocks.
I hope it's alright that I am emailing you all about it, as (from my
queries to forums) this seems like a feature that many people want, and I
believe that it could catalyze 3rd party blender development in a big way
by making coding with blender much easier to learn.

I understand that an identical
venture<http://pythonide.blogspot.com/2009/03/resumable-ipython-inside-blender_31.html>has
found success in 2009 in integrating ipython with blender, however
this
solution no longer works. Perhaps there is a way of tweaking it to work,
but I'm afraid I do not understand what is happening well enough to know
where to begin. I have tried a couple other approaches:

First, I attempted to use the internal blender console to embed IPython. I
append my standard python3 sys.path to the internal blender sys.path, then
I do:

import IPython
IPython.embed()

and I get the following traceback:
>>> npath =  ['',
...  '/usr/bin',
...  '/usr/lib/python3.3',
...  '/usr/lib/python3.3/plat-x86_64-linux-gnu',
...  '/usr/lib/python3.3/lib-dynload',
...  '/usr/local/lib/python3.3/dist-packages',
...  '/usr/lib/python3/dist-packages',
...  '/usr/lib/python3/dist-packages/IPython/extensions']
>>> import sys
>>> for p in npath:
...     sys.path.append(p)
...
>>> import IPython
>>> IPython.embed()
Traceback (most recent call last):
  File "<blender_console>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/IPython/frontend/terminal/embed.py",
line 282, in embed
    _embedded_shell = InteractiveShellEmbed(**kwargs)
  File "/usr/lib/python3/dist-packages/IPython/frontend/terminal/embed.py",
line 97, in __init__
    display_banner=display_banner
  File
"/usr/lib/python3/dist-packages/IPython/frontend/terminal/interactiveshell.py",
line 360, in __init__
    user_module=user_module, custom_exceptions=custom_exceptions
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py",
line 455, in __init__
    self.init_readline()
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py",
line 1844, in init_readline
    self.refill_readline_hist()
  File "/usr/lib/python3/dist-packages/IPython/core/interactiveshell.py",
line 1853, in refill_readline_hist
    stdin_encoding = sys.stdin.encoding or "utf-8"
AttributeError: 'NoneType' object has no attribute 'encoding'

I have tried to use the -d option which (according to the blender man
pages) should ensure that sys.stdin is not set to None, however, in both
2.66 and 2.68a sys.stdin evaluates to None even with this option set.

My other route of action has been to use the terminal I am running blender
from as the interpreter using `blender --python-console`. Unfortunately,
this option results in a blank window and when I attempt to embed IPython I
get the following traceback:

>>> import IPython
>>> IPython.embed()
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
/usr/lib/python3.3/code.py in runcode(self, code)
     88         """
     89         try:
---> 90             exec(code, self.locals)
     91         except SystemExit:
     92             raise

<console> in <module>()

/usr/lib/python3/dist-packages/IPython/frontend/terminal/embed.py in
embed(**kwargs)
    281     if _embedded_shell is None:
    282         _embedded_shell = InteractiveShellEmbed(**kwargs)
--> 283     _embedded_shell(header=header, stack_depth=2)

/usr/lib/python3/dist-packages/IPython/frontend/terminal/embed.py in
__call__(self, header, local_ns, module, dummy, stack_depth, global_ns)
    155         # Call the embedding code with a stack depth of 1 so it can
skip over
    156         # our call and get the original caller's namespaces.
--> 157         self.mainloop(local_ns, module, stack_depth=stack_depth,
global_ns=global_ns)
    158
    159         self.banner2 = self.old_banner2

/usr/lib/python3/dist-packages/IPython/frontend/terminal/embed.py in
mainloop(self, local_ns, module, stack_depth, display_banner, global_ns)
    202             if module is None:
    203                 global_ns = call_frame.f_globals
--> 204                 module = sys.modules[global_ns['__name__']]
    205
    206         # Save original namespace and module so we can restore them
after

KeyError: '__console__'

I am using Linux Mint 15, IPython 3.3.1, blender 2.66 and 2.68a (getting
the same results in all cases with both versions of blender).

Thank you very much :)

~Gabriel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.blender.org/pipermail/bf-python/attachments/20130915/7ec9c022/attachment.html>


More information about the Bf-python mailing list