我正在使用IPython和Cython。
我正在外部文本编辑器中编辑模块中的Cython函数。
我想导入这些模块并在IPython中使用它们,但是在导入时用IPython编译它们。
这样做的语法是什么?我不希望我的代码在我的IPython笔记本中。
答案 0 :(得分:3)
这是一个不寻常的工作流程,但它应该可以让一些工作。首先,要使您的IPython会话能够import
,它们必须出现在sys.path
中。您可以在该列表中插入新文件夹,如下所示:
您要添加的路径将是编译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
你可能需要玩一点才能找到有用的东西,但是某些东西对你的用例来说应该是可行的。