IPython run magic: как создать псевдоним для "run -i"?

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

Я думаю о двух возможных способах сделать это. Во-первых, как указано в заголовке, я мог бы сделать псевдоним для run -i:

%alias_magic lab_run run -i

но это возвращает ошибку:

UsageError: unrecognized arguments: -i 

Есть ли способ обойти это?

Кроме того, я мог бы обнаружить внутри скрипта, если -i флаг был передан и выдает ошибку, если нет. Тем не менее, он не отображается в sys.argv список:

In [1]: import sys
In [2]: run -i test.py random args
['test.py', 'random', 'args']

Я не могу использовать файлы ipy, потому что мне нужно прочитать% run flags, как объяснено в моем предыдущем вопросе здесь: Как добавить пользовательский флаг в магические команды IPython? (.ipy файлы)

Кто-нибудь видит решение этой проблемы?

2 ответа

Решение

Вы можете определить свою собственную магическую функцию и использовать %run -i в этом:

from IPython.core.magic import register_line_magic

@register_line_magic
def r(line):
    get_ipython().magic('run -i ' + line)

del r

РЕДАКТИРОВАТЬ

Как указывает hpaulj magic устарела. Вот версия с новымrun_line_magic:

from IPython.core.magic import register_line_magic

@register_line_magic
def r(line):
    get_ipython().run_line_magic('run', ' -i ' + line)

del r
Now:

%r

делает так же, как:

%run -i

спасибо @Mike за ваш ответ , он указал мне правильное направление для создания псевдонима клеточной магии

я нашел это %alias_magic [-l] [-c] [-p PARAMS] name target, в документах , помогает мне

в моем случае:

      %alias_magic --cell py_310 script -p C:\Users\myname\AppData\Local\Programs\Python\Python310\python

выход

      Created `%%py_310` as an alias for `%%script C:\Users\myname\AppData\Local\Programs\Python\Python310\python`.

который затем можно использовать как

      %%py_310

import sys

print(sys.version_info)

выход

      sys.version_info(major=3, minor=10, micro=1, releaselevel='final', serial=0)
Другие вопросы по тегам