Как оставить комментарий после магической команды IPython

Как добавить комментарий в конце магической команды IPython?

Например, пытаясь использовать %cd:

%cd "dir"  # comment

Я хочу перейти в каталог dir но вместо этого я получаю:

[Errno 2] No such file or directory: 'dir # comment'

2 ответа

В общем случае это невозможно, потому что магические команды IPython анализируют свои собственные командные строки.*

Есть некоторые волшебные команды, в которых комментарии вроде бы работают , но на самом деле они обрабатываются по-другому. Например:

  • %ls # commentработает исправно, но%lsявляется псевдонимом команды оболочки, поэтому оболочка анализирует комментарий.
  • %automagic 0 # commentведет себя как%automagic, переключение параметра вместо его исключительного отключения, например%automagic 0сделал бы. Это как если бы0 # commentэто все одна строка, которую он игнорирует.
  • %run $filename # commentрассматривает комментарий как аргументы, поэтому['#', 'comment']заканчивается вsys.argvдля$filename.

Обходной путь

Вы можете вызывать волшебные команды, используя исключительно синтаксис Python.

Сначала получите работающий экземпляр IPython с помощьюget_ipython():

      ipython = get_ipython()

Затем:

      ipython.run_line_magic('cd', 'dir')  # comment

Или для клеточной магии вы можете пойти от этого (что не работает):

      %%script bash  # comment
echo hello

к этому:

      ipython.run_cell_magic('script', 'bash', 'echo hello')  # comment

Другой вариант, я полагаю, состоит в том, чтобы запустить всю ячейку, подавляя вывод, так как он возвращаетExecutionResultобъект:

      ipython.run_cell('%cd dir');  # comment

* Я не уверен, что это задокументировано явно, но это неявно задокументировано при определении пользовательских magics , и я нашел подсказки в этой проблеме GitHub: Разрешить комментарии после аргументов в magic_arguments .

TL;DR: Вы не можете, как обстоят дела. Это может быть или не быть ошибкой в ​​реализации%cd.

Пока это не будет исправлено, один из способов избежать этого — использовать:

      import os
os.chdir("dir") #some comment here

Второй вариант — использование команд bash. Однако%это волшебная команда, не эквивалентная команде bash. Это сделано специально, так как может изменить текущий каталог записной книжки .

Это не то же самое, что например

      !cd dir #some comment here

Что создаст оболочку и выполнит там команду, не изменив при этом текущий каталог. (Вы можете проверить, используяpwdдо/после каждой команды)

Обратите внимание, что если ваша цель не состоит в том, чтобы изменить текущий каталог ноутбука jupyter, вы можете выполнить несколько команд в одной ячейке с помощью магии%sh:

      %%sh 
cd dir #some comment here
ls #some more commands here
....

Эта команда создаст оболочку, и все команды bash будут выполняться там, поэтому текущий каталог jupyter не изменится.

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