打包Python项目及其关联的IPython magic扩展

打包Python项目及其关联的IPython magic扩展,python,pip,jupyter-notebook,ipython-magic,python-poetry,Python,Pip,Jupyter Notebook,Ipython Magic,Python Poetry,我正在为Pypi部署一个Python项目,我们称之为foobar。我想用shell命令和IPython magic命令来分发它。我使用诗歌,我的.toml配置文件的相关部分是: [tool.poetry.scripts] foobar = 'foobar.cli:main' foobar_magic = 'foobar.magic:load_ipython_extension' 将其上载到TestPypi并使用pip安装后,shell命令(foobar)将按预期工作。但是,在Jup

我正在为Pypi部署一个Python项目,我们称之为
foobar
。我想用shell命令和IPython magic命令来分发它。我使用诗歌,我的
.toml
配置文件的相关部分是:

  [tool.poetry.scripts]
  foobar = 'foobar.cli:main'
  foobar_magic = 'foobar.magic:load_ipython_extension'
将其上载到TestPypi并使用
pip
安装后,shell命令(
foobar
)将按预期工作。但是,在Jupyter笔记本中执行
%load\u ext foobar\u magic
失败,原因是:

  ModuleNotFoundError: No module named 'foobar_magic'
根据报告:

您可以将扩展模块放在任何您想要的地方,只要它们可以通过Python的标准导入机制导入

在同一个笔记本下,我验证了
!foobar
导入foobar
都可以工作。我怎样才能让
foobar\u magic
也被找到

此外,虽然我还不在那里,但我猜入口点的后缀也错了。实际上,我在
之后指定的函数将被调用,而不带任何参数,但函数
load\u ipython\u extension()
需要一个ipython实例

所以我觉得完全迷路了,找不到任何部署IPython笔记本扩展的相关文档


编辑1。
%load\u ext foobar.magic
意外工作,并且magic
%foobar
不会抱怨参数。我不明白为什么,为什么它是
%foobar
,而不是
%foobar\u magic


编辑2。被忽略或无用的
foobar\u magic=…
内容。禁用它不会对
%load\u ext foobar.magic
产生任何影响。我认为后一种调用可能还可以。但不明白发生了什么有点烦人。

我终于找到了解决办法:

  • 删除my
    .toml
    的行
    foobar\u magic=…
  • foobar/magic.py
    的内容移动到
    foobar/\uuuu init\uuuuuu.py
    (最初为空),由以下两行保护:

    import sys
    if "ipykernel" in sys.modules:
       # magic stuff
    
  • 每次导入模块时都会执行此文件,现在就可以执行(在笔记本下):

    当且仅当foobar从IPython导入时,守卫确保执行魔法

  • 这并没有回答我最初的问题,我仍然不完全理解这些入口点应该如何工作,但我对实际结果感到满意

    %load_ext foobar