-1

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

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

将其上传到 TestPypi 并使用 安装后pip,shell 命令 ( foobar) 将按预期工作。但是,%load_ext foobar_magic在 Jupyter Notebook 中执行失败并显示:

  ModuleNotFoundError: No module named 'foobar_magic'

根据文档

你可以把你的扩展模块放在你想要的任何地方,只要它们可以被 Python 的标准导入机制导入。

在同一个笔记本下,我已经验证了这一点!foobar并且import foobar两者都有效。我怎样才能foobar_magic被发现呢?

而且,虽然我还没到那里,但我猜入口点的后缀也是错误的。实际上,我在 之后指定的函数:将不带参数调用,但该函数load_ipython_extension()需要一个 IPython 实例。

所以我完全迷失了方向,找不到任何部署 IPython Notebook 扩展的相关文档。


编辑 1. %load_ext foobar.magic出乎意料地起作用,而且魔法%foobar 不会抱怨这些论点。我不明白为什么,为什么它是%foobar而不是%foobar_magic像声明的那样。

编辑 2.这些foobar_magic = ...东西被忽略或无用。抑制它对 没有任何影响%load_ext foobar.magic。我认为后一种调用可能没问题。但是不明白发生了什么有点烦人。

4

1 回答 1

0

我终于找到了解决方法:

  1. 删除foobar_magic = ...我的.toml.
  2. 移动foobar/magic.pyto的内容foobar/__init__.py(原本为空),用以下两行保护:

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

    %load_ext foobar
    

    当且仅当从 IPython 导入 foobar 时,守卫确保执行神奇的东西。

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

于 2020-05-02T18:51:14.447 回答