<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
<br>
Fernando,<br>
&nbsp; Thanks for your response. Unfortunately, I've been looking at this
some more and things are looking less good. There seems to something
subtle going on with how python is treating __main__. Depending how
things are started up, the method I found below doesn't always work.
There are also odd things (as you point out) about pickling/unpickling.
Part of the issue is my own method of working - I tend to pickle just
about everything in __main__. Unpickling it seems to mess something up
in ipython. At least I can run my code under ipython and begin to
experiment with it. I'll continue digging and try to find fixes.<br>
&nbsp;&nbsp; Dave<br>
<br>
Fernando Perez wrote:
<blockquote
 cite="mid:db6b5ecc0801040223n1901edbdo3a80a213565490c4@mail.gmail.com"
 type="cite">
  <pre wrap="">Hi Dave,

On Jan 3, 2008 3:11 PM, Dave Grote <a class="moz-txt-link-rfc2396E" href="mailto:dpgrote@lbl.gov">&lt;dpgrote@lbl.gov&gt;</a> wrote:
  </pre>
  <blockquote type="cite">
    <pre wrap="">Hello All,
  Is there a nice way of getting ipython to use the original __main__
rather than creating its own? In my code, I have python calling C code,
which then calls python code, using PyRun_SimpleString. The
PyRun_SimpleString will call, for example, a function defined in python
before the C code is called. This works fine in plain python. But not in
ipython - it by default creates its own name space which
PyRun_SimpleString can't directly get at. I came up with the following,
which seems to work ok,

import __main__
__main__.__name__ = "__mynamespace__"
import IPython
IPython.Shell.start(user_ns=__main__.__dict__).mainloop()

Setting __name__ is needed to prevent the ipython __main__ from being
replaced by a FakeModule, which doesn't seem to interact with
PyRun_SimpleString. Is this a sensible solution? Has anyone else done
this kind of thing?
  Any and all comments welcome! Thanks!
      Dave
    </pre>
  </blockquote>
  <pre wrap=""><!---->
Your approach is probably as good as I can think of, and it's why
ipython offers the user the option of providing his own execution
namespace.  I know we've had plenty of problems in the past with using
the plain python __main__, which is why we resorted to the hack of
creating that whole FakeModule business.  It's inelegant but it was
the only way I could find of solving certain bizarre
pickling/unpickling failures that were reported long ago.

But if you are not using pickle/unpickle in your own code (or don't
see any problems related to it), I dont' really find any fault in your
approach.

I should add that I'm not defending the whole FakeModule hackery: I'd
love to have a cleaner solution, since it does create other problems.
But so far it seems to be the lesser of several evils.  Improvements
always welcome...

Cheers,

f

ps - it's worth noting that problems like this are to some extent
inevitable with ipython, since ipython is *itself* a (rather complex)
python program running on top of the 'real' python VM, but it's trying
very hard to 'fade into the background' so your own code appears to
live in an otherwise unmodified python VM.  Sometimes, the illusion
breaks and you see the wires we're hanging from :)

  </pre>
</blockquote>
</body>
</html>