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

时间:2015-02-15 22:45:55

标签: ipython cython

我正在使用IPython和Cython。

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

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

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

1 个答案:

答案 0 :(得分:3)

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

enter image description here

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

其次,您需要一种编译Cython模块的方法。如果您使用推荐的方法,那么您将拥有一个包含cython源的setup.py文件和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

您可以使用

重新加载模块
reload(my_cython_module)

您可以尝试使用某种逻辑来聪明,以便只需重新运行笔记本即可重新加载或导入:

# 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

你可能需要玩一点才能找到有用的东西,但是某些东西对你的用例来说应该是可行的。