2013-08-13 10 views
18

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

import imp 
imp.reload(Extension) 

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

ответ

16

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

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

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

  1. отстроить расширение
  2. перезагрузка ядра
  3. Run All в перезапишите блокнот

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

0

Вы можете попробовать установить autoreload в ipython shell, documentation here.

Set autoreload

In [1]: %load_ext autoreload 

In [2]: %autoreload 2 

Набор autoreload на конкретном модуле

%aimport foo 

Кроме того, обратите внимание на dreload (больше на dreloadhere) и run-magic

+4

Это не работает для моего случая, в документации по автозагрузке указано, что: «Модули расширения C нельзя перезагружать и поэтому не могут быть загружены автозагрузкой». – clstaudt

-2

IPython обеспечивает путь к automatically reload modules:

In [1]: %load_ext autoreload 
In [2]: %autoreload 2 

еще можно использовать (редактировать: питон 2 только)

reload(module) 

См this answer для Python3 перезагрузкой.

+0

Юмористический, ты ответил через 5 секунд после меня. Очень здорово, когда это происходит. – enginefree

+0

'reload' не является встроенным в Python 3, я считаю. – clstaudt

+0

: x Я бы перенаправил этот вопрос [http: // stackoverflow.com/questions/5364050/reloading-submodules-in-ipython), но я недостаточно хорошо знаком с системой @cls: oups, my bad – Laurent

Смежные вопросы