Упаковка проекта Python и связанного с ним расширения I Python magi c - PullRequest
0 голосов
/ 02 мая 2020

Я нахожусь в процессе развертывания в Pypi проекта Python, назовем его foobar. Я хотел бы распространить его с помощью команды оболочки и и команды I Python magi c. Я использую Poetry, и соответствующая часть моего .toml файла конфигурации:

  [tool.poetry.scripts]
  foobar = 'foobar.cli:main'
  foobar_magic = 'foobar.magic:load_ipython_extension'

После загрузки этого файла в TestPypi и установки его с pip, команда оболочки (foobar) работает как положено , Однако выполнение %load_ext foobar_magic в ноутбуке Jupyter завершается неудачно с:

  ModuleNotFoundError: No module named 'foobar_magic'

В соответствии с документацией :

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

В одной и той же записной книжке я убедился, что оба !foobar и import foobar работают. Как я могу также найти foobar_magic?

Более того, хотя я еще не там, я думаю, суффикс точки входа тоже неверен. Действительно, указанная после : функция будет вызываться без аргументов, но функция load_ipython_extension() ожидает экземпляр I Python.

Так что я чувствую себя полностью растерянным и не могу найти ни одного соответствующая документация для развертывания расширений I Python Notebook.


Edit 1. %load_ext foobar.magic неожиданно работает, и волхвы c %foobar не жалуются на аргументы , Я не понимаю, почему и почему это %foobar, а не %foobar_magic, как заявлено.

Edit 2. Материал foobar_magic = ... игнорируется или бесполезен. Подавление не имеет никакого значения для %load_ext foobar.magic. Я думаю, что последний вызов может быть в порядке. Но немного раздражает не понимать, что происходит.

1 Ответ

0 голосов
/ 02 мая 2020

Я наконец-то нашел обходной путь:

  1. Удалите строку foobar_magic = ... из моих .toml.
  2. Переместите содержимое foobar/magic.py в foobar/__init__.py (изначально пустой), защищен следующими двумя строками:

    import sys
    if "ipykernel" in sys.modules:
       # magic stuff
    
  3. Этот файл, выполняемый при каждом импорте модуля, теперь достаточно сделать (под записной книжкой):

    %load_ext foobar
    

    Охранник обеспечивает выполнение магических вещей c, если и только если foobar импортирован из I Python.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...