Подтвердить что ты не робот

Перезагрузка модуля расширения Python из IPython

Используя Cython, я разрабатываю модуль расширения, который создается как файл .so. Затем я тестирую его с помощью IPython. Во время разработки мне часто нужно вносить изменения и перестраивать. Мне также необходимо выйти из оболочки IPython и повторно ввести все команды. Переопределение модуля с помощью

import imp
imp.reload(Extension)

не работает, код не обновляется. Есть ли способ избежать перезапуска оболочки IPython после того, как я перестрою модуль?

4b9b3361

Ответ 1

Расширения C не могут быть перезагружены без перезапуска процесса (см. эту официальную ошибку Python для получения дополнительной информации).

Поскольку вы уже используете IPython, я бы рекомендовал использовать один из двухпроцессорных интерфейсов, таких как Notebook или QtConsole, если он вам подходит. Это позволяет вам легко перезапустить процесс ядра, что позволяет загружать модуль заново. Очевидно, что это не так удобно, как перезагрузка модуля Python, потому что вам нужно выполнить повторное выполнение, чтобы вернуться в одно и то же состояние. Но этого нельзя избежать, поэтому нужно уменьшить неудобства.

Я нашел интерфейс ноутбука наиболее удобным для разработки расширений, поскольку он обеспечивает самый простой способ вернуться в одно и то же состояние:

  • восстановить расширение
  • перезапустить ядро ​​
  • Запустить все, чтобы перезапустить ноутбук

и вы вернетесь в одно и то же состояние с новой версией расширения. Пробег может варьироваться в зависимости от того, насколько дорогостоящей будет ваша интерактивная работа, но она мне хорошо послужила.

Ответ 2

Вы можете попробовать установить autoreload в документации ipython shell, здесь.

Установить autoreload

In [1]: %load_ext autoreload

In [2]: %autoreload 2

Установите autoreload на конкретном модуле

%aimport foo

Кроме того, посмотрите dreload (подробнее на dreload здесь) и run-magic