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