[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