Как оставить комментарий после магической команды 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
- Документы:
InteractiveShell.run_line_magic()
Или для клеточной магии вы можете пойти от этого (что не работает):
%%script bash # comment
echo hello
к этому:
ipython.run_cell_magic('script', 'bash', 'echo hello') # comment
- Документы:
InteractiveShell.run_cell_magic()
Другой вариант, я полагаю, состоит в том, чтобы запустить всю ячейку, подавляя вывод, так как он возвращаетExecutionResult
объект:
ipython.run_cell('%cd dir'); # comment
- Документы:
InteractiveShell.run_cell()
* Я не уверен, что это задокументировано явно, но это неявно задокументировано при определении пользовательских 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 не изменится.