如何将Cython模块导入IPython笔记本并编译

如何将Cython模块导入IPython笔记本并编译,ipython,cython,Ipython,Cython,我正在使用IPython和Cython 我正在外部文本编辑器的模块中编辑Cython函数 我想导入这些模块并在IPython中使用它们,但在导入时使用IPython编译它们 这样做的语法是什么?我不希望我的代码出现在IPython笔记本中。这是一个不寻常的工作流,但应该可以让某些东西正常工作。首先,对于要在IPython会话中导入的内容,它们必须出现在sys.path中。您可以按如下方式在该列表中插入新文件夹: 您要添加的路径将是放置已编译Cython模块的文件夹。无论您接下来使用哪种策略,您

我正在使用IPython和Cython

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

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


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

这是一个不寻常的工作流,但应该可以让某些东西正常工作。首先,对于要在IPython会话中导入的内容,它们必须出现在
sys.path
中。您可以按如下方式在该列表中插入新文件夹:

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

其次,您需要一种编译Cython模块的方法。如果您使用的是推荐的方法,那么将有一个包含cython源代码的
setup.py
文件和
python setup.py build\u ext
来生成编译后的
.pyd
文件。每次重新编译Cython模块时,都必须重新启动IPython内核

除了
setup.py
,还有其他选择。其中之一是my,它是一个命令行工具,可以将
.pyx
源代码编译成
.pyd
,而无需
设置.py
。此工具仅由我使用/测试,因此它可能无法工作,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

您可能需要花点时间来寻找一些有效的方法,但对于您的用例来说,这些方法应该是可行的。

即使使用
pyximport
方法,我们也需要修改
sys.path
吗?