Подтвердить что ты не робот

Если __name__ == '__main__' в IPython

У меня есть скрипты Python, которые используют трюк if __name__ == '__main__', чтобы некоторый код запускался только тогда, когда script вызывается как script, а не когда он загружается в интерактивный интерпретатор. Однако, когда я редактирую эти сценарии из IPython с помощью команды %edit, IPython, по-видимому, устанавливает __name__ в '__main__', и поэтому код запускается каждый раз, когда я выхожу из сеанса редактирования. Есть ли хороший способ сделать этот код не запущенным, когда модуль отредактирован с IPython?

4b9b3361

Ответ 1

При работе с Emacs (который, как я полагаю, близок к тому, что вы получаете с %edit), я обычно использую этот трюк:

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

По понятным причинам __file__ определяется только для import 'ed модулей, а не для интерактивной оболочки.

Ответ 2

Похоже, вам может понадобиться только переключатель -x:

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...

При вызове %edit -x код не будет выполнен после выхода из редактора.

Ответ 3

IPython добавляет функцию get_ipython() к глобально доступным переменным. Таким образом, вы можете проверить, существует ли эта функция в globals(), чтобы принять ваше решение:

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

В приведенном выше коде просто проверяется, существует ли глобальная переменная с именем get_ipython. Чтобы также проверить, является ли эта переменная вызываемой, вы можете:

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

Ответ 4

IPython автоматически выполняет код, который вы пишете с помощью команды %edit. Вы можете использовать %edit -x, чтобы указать, что вы НЕ хотите запускать код, который вы только что редактировали.

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