Игнорировать магию IPython в Python

Каков наилучший способ игнорировать магию IPython при запуске сценариев с использованием интерпретатора python?

Я часто включаю магию IPython в мои файлы сценариев, потому что они работают с кодом в интерактивном режиме. Например, с autoreload магия, я не должен держать reload- после того, как я внесу некоторые изменения и исправлю ошибки:

%load_ext autoreload
%autoreload 2

Однако, когда я пытаюсь запустить этот скрипт, используя обычный интерпретатор python, я получаю сообщение об ошибке:

  File "<string>", line 1
    %load_ext autoreload
    ^
SyntaxError: invalid syntax

Обертывание IPython магии внутри if Оператор не работает, потому что неверный синтаксис обнаружен до того, как файл действительно запущен.


Итак, каков наилучший способ заставить Python игнорировать магию IPython?

Раздражает необходимость менять ваши скрипты всякий раз, когда вы хотите запустить затем в python, pdb, sphinx и т. Д.

5 ответов

Решение

Для всех инструментов, которые могут читать из стандартного ввода, вы можете использовать grep, чтобы удалить любые магические строки и передать результат в python:

grep -v '^%' magicscript.ipy | python

Хорошо работает как псевдоним bash:

alias pynomagic='( grep -v "^%" | python ) < '
pynomagic magicscript.ipy

Такие инструменты, как pdb, которые принимают только имена файлов, могут быть вызваны так (снова bash):

pdb <(grep -v '^%' magicscript.ipy)

На случай, если это кому-нибудь поможет.

По крайней мере для Databricks при синхронизации записной книжки с файлом.py в Github можно указать волшебную функцию со специально отформатированным комментарием. Как это:

# MAGIC %run ./my_external_file

Вы должны загрузить такую ​​магию в ваш конфигурационный файл, а не в ваши скрипты! Это просто не действительный Python.

Поместите следующее в ваш ~/.ipython/profile_default/ipython_config.py:

c = get_config()
c.InteractiveShellApp.extensions = ['autoreload']
c.InteractiveShellApp.exec_lines = ['%autoreload 2']
c.InteractiveShellApp.exec_lines.append('print("Warning: disable autoreload in ipython_config.py to improve performance.")')
  1. Создайте файл шаблона с именем simplepython.tpl, Скопируйте нижеприведенные заявления.

    {% extends 'python.tpl'%}
    {% block codecell %}
    {{  super().replace('get_ipython','#get_ipython') if "get_ipython" in super() else super() }}
    {% endblock codecell %}
    
  2. Сохранить simplepython.tpl,

  3. Введите в командной строке:

    jupyter nbconvert - to python 'Блокнот IPY' --template=simplepython.tpl --stdout

Spyder выдает предупреждение (как показано на рисунке ниже), когда кодер использует этот тип кода и говорит, что это недопустимый код Python.

Итак, чтобы использовать магию IPython, сохранение файлов с расширением .ipy может быть решением.

Скриншот спайдера

Другие вопросы по тегам