if __name__ == '__main__' in IPython

12,234

Solution 1

When working from within Emacs (which I assume is close to what you get with %edit), I usually use this trick:

if __name__ == '__main__' and '__file__' in globals():
    # do what you need

For obvious reasons, __file__ is defined only for import'ed modules, and not for interactive shell.

Solution 2

It sounds like you might just need the -x switch:

In [1]: %edit
IPython will make a temporary file named: /tmp/ipython_edit_J8j9Wl.py
Editing... done. Executing edited code...
Name is main -- executing
Out[1]: "if __name__ == '__main__':\n    print 'Name is main -- executing'\n"

In [2]: %edit -x /tmp/ipython_edit_J8j9Wl
Editing...

When you call %edit -x the code is not executed after you exit your editor.

Solution 3

IPython adds the function get_ipython() to the globally available variables. So you can test, whether this function exist in globals() to make your decision:

if __name__ == '__main__' and "get_ipython" not in dir():
    print "I'm not loaded with IPython"

The above code just tests whether there is a global variable with name get_ipython. To also test whether this variable is callable, you can do:

if __name__ == '__main__' and not callable(globals().get("get_ipython", None)):
    print "I'm not loaded with IPython"

Solution 4

IPython automatically executes the code you write with the %edit command. You can use %edit -x to specify that you do NOT want to run the code you were just editing.

http://ipython.org/ipython-doc/stable/api/generated/IPython.core.magics.code.html

Share:
12,234

Related videos on Youtube

ajd
Author by

ajd

Updated on September 15, 2022

Comments

  • ajd
    ajd over 1 year

    I have Python scripts that use the if __name__ == '__main__' trick to have some code only run when the script is called as a script and not when it is loaded into the interactive interpreter. However, when I edit these scripts from IPython using the %edit command, IPython apparently sets __name__ to '__main__' and so the code gets run every time I exit the editing session. Is there a good way to make this code not run when the module is edited from IPython?

  • Paul H
    Paul H about 10 years
    that -x switch is crucial.
  • ajd
    ajd about 10 years
    Thanks; this is useful, but it doesn't quite do what I want because I want IPython to load the functions/classes defined in the module, just not run the test code associated with the module.
  • Two-Bit Alchemist
    Two-Bit Alchemist about 10 years
    No problem. I thought you might have some clarification like this. I would personally recommend @ffriend's answer in light of this.
  • Wayne
    Wayne about 6 years
    For those not aware that Jupyter notebooks were developed from IPython notebooks, I'll point out that the addition of the second part works in Jupyter notebooks so that the pertinent code block won't be run when pasted into the cell of a notebook. Also, those considering this may be interested in the approach featured here.