Не позволяйте ячейкам или магическим функциям сохраняться в скрипте python

Можно ли отключить магические функции или произвольные блоки ячеек при сохранении записной книжки ipython в скрипт?

Я использую режим, в котором сохранение файла .ipynb автоматически сохраняется и в .py, но магические функции, которые я использую, ломают сценарий. Я пробовал такие вещи, как

magic_cmd = """%cd ~/
%load_ext autosave
%autosave 30
"""
if in_ipython():
    eval(magic_cmd)

который, по-видимому, не любит магические функции и выдает SyntaxError (я бы все равно не использовал eval...). Есть ли какой-нибудь код Javascript, который я мог бы использовать, который просто предотвращает сохранение ячейки?

Итак, 2 части вопроса:

  1. Есть ли способ, чтобы все магические функции не сохранялись в скрипт?
  2. Есть ли способ предотвратить сохранение любой произвольной ячейки в сценарий или, скажем, все ячейки ниже определенной точки от сохранения в сценарий (аналогично команде «Ячейка> Выполнить все выше»)?

person beardc    schedule 10.05.2013    source источник
comment
Вам нужно, чтобы полученный скрипт запускался с помощью python? Если вы добавите исполняемый файл ipython в #! строку поверх результирующего сценария .py, он будет работать нормально.   -  person nom-mon-ir    schedule 10.05.2013
comment
Мне нужно, чтобы он был доступен кому-то без ipython, так что да, на данный момент он должен работать на python. Я должен изучить этот вариант на будущее, хотя - спасибо за указатель.   -  person beardc    schedule 10.05.2013


Ответы (1)


Я не знаю, как предотвратить его сохранение в сценарии, но вы можете (1) добавить тест, чтобы убедиться, что магия выполняется только в ipython, и (2) преобразовать базовый синтаксис магии в синтаксис, который приемлемо для простого python

magic_cmds = """%cd ~/
%load_ext autosave
%autosave 30
"""
if in_ipython():
    for magic_cmd in magic_cmds.splitlines() :
        get_ipython().magic(magic_cmd[1:])

Это работает как в ipython, так и в python, за исключением того, что python явно не выполняет команды. Обратите внимание, что если вы удаляете знаки % из своей строки, вы должны удалить [1:] из последней строки.

Лично я предпочитаю следующую версию, потому что она перехватывает исключение, когда in_ipython не определено, хотя вы, безусловно, можете таким же образом добавить try к приведенному выше.

try :
    if(__IPYTHON__) :
        get_ipython().magic(u'cd ~/')
        get_ipython().magic(u'load_ext autosave')
        get_ipython().magic(u'autosave 30')
except NameError :
    pass

Редактировать

Точно так же можно включить клеточную магию. Например, чтобы перевести ячейку ipython

%%R -o x
x <- c(1,2,3)

ты бы написал

get_ipython().run_cell_magic(u'R', u'-o x', u'x <- c(1,2,3)')

Я не могу найти много информации об этой команде, кроме встроенного текста справки, но я думаю, что аргументы говорят сами за себя. И, конечно же, многострочные вводы также можно использовать в третьем аргументе, вставляя символы новой строки ('\n') в строку.

В общем, если вы хотите что-то перевести, просто напишите это в блокноте, а затем нажмите File -> Download as... -> Python (.py) и посмотрите в сценарии, который у вас получится.

person Mike    schedule 28.09.2013
comment
Довольно многословно, но пока похоже на единственное выполнимое решение. Спасибо! - person beardc; 29.09.2013
comment
Я добавил версию, более похожую на оригинал. Надеюсь, не слишком многословно. :) - person Mike; 30.09.2013
comment
Я предпочитаю версию try/except... просто не будет способа превзойти магические методы для краткости... - person beardc; 09.10.2013
comment
@тиас Да. Мой ответ слишком длинный, чтобы оставить комментарий, поэтому я отредактировал свой ответ выше. - person Mike; 24.06.2014