如何将 Cython 模块导入 IPython Notebook 并进行编译

Gin*_*ger 4 ipython cython

我正在使用 IPython 和 Cython。

我正在外部文本编辑器的模块中编辑我的 Cython 函数。

我想导入这些模块并在 IPython 中使用它们,但在导入时使用 IPython 编译它们。

这样做的语法是什么?我不希望我的代码在我的 IPython 笔记本中。

Cal*_*ngh 5

这是一个不寻常的工作流程,但应该可以使某些工作正常进行。首先,为了import能够在您的 IPython 会话中使用,它们必须出现在sys.path. 您可以在该列表中插入新文件夹,如下所示:

在此处输入图片说明

您要添加的路径将是放置已编译 Cython 模块的文件夹。无论您使用哪种策略,至少.pyd需要打开已编译 ( ) Cython 模块的路径sys.path才能导入。

其次,您需要一种编译 Cython 模块的方法。如果您使用推荐的方法,您将拥有一个setup.py包含 cython 源的文件并python setup.py build_ext生成编译.pyd文件。每次重新编译 Cython 模块时,您都必须重新启动 IPython 内核。

有替代方案setup.py。其中之一是我的easycython这是一个命令行工具,编译.pyx源进入.pyd,而无需一个setup.py。这个工具是 AFAIK 只被我使用/测试过,所以它可能不起作用,ymmv 等等。每次重新编译你的 Cython 模块时,你仍然需要重新启动你的 IPython 内核。(我在这里提到它只是因为它是我的宝贝之一。)

更好的方法是使用pyximport,因为它将按需编译支持重新加载

# This is inside your IPython Notebook
import pyximport
pyximport.install(reload_support=True)
import my_cython_module
Run Code Online (Sandbox Code Playgroud)

您可以重新加载模块

reload(my_cython_module)
Run Code Online (Sandbox Code Playgroud)

您可以尝试巧妙地使用某种逻辑来制作它,以便只需重新运行笔记本即可重新加载或导入:

# Speculative code: I have not tried this!
# This is inside your IPython Notebook
import pyximport
pyximport.install(reload_support=True)
if 'my_cython_module' in dir(): # Maybe sys.modules is better?
    reload(my_cython_module)
else:
    import my_cython_module
Run Code Online (Sandbox Code Playgroud)

您可能需要稍微尝试一下才能找到可行的方法,但对于您的用例来说,有些方法应该是可行的。