将预编译的Cython代码分发给Windows

时间:2015-12-09 21:56:51

标签: python windows cython

对于一堂课,我写了一个数值问题的求解器。我的代码运行在一个IPython笔记本中,其中大部分代码都是纯Python + NumPy + matplotlib,但性能关键部分是用Cython编写的(并包含在IPython %%cython魔法中)。教授喜欢我的解决方案,并要求我向一些本科生提供,他将在另一个班级教授类似的主题作为参考资料。问题是,我不确定分发代码的最佳方式是什么。

我的主要问题是,大多数学生可能都在运行Windows。在Windows上编译Cython代码是我最后一次做的噩梦,因为你必须与几个不同的C编译器一起玩,直到找到一个有效的编译器。对于想要运行我的笔记本以获得有效的Cython环境的每个学生来说,绝对不能期待它。

我有想法在Windows机器上预编译代码的Cython部分(它不需要由学生更改)并分发pyd文件。所以我的问题是:

我可以期望在Windows上编译的Cython二进制文件可以在另一台Windows机器上使用吗?

1 个答案:

答案 0 :(得分:7)

是的,你可以期望二进制.pyd文件在不同的Windows机器上运行,只要python版本与编译Cython模块的版本相匹配,包括x86 / x64 < / em>差异。

在Windows上构建扩展模块不再像以前那样困难。

最简单的方法是在安装程序中使用包含编译器Anaconda Python。它是目前可用的“Just Works”最接近的东西。如果需要,使用conda命令行工具创建虚拟环境,还可以很容易地为每个Python版本构建一个二进制版本。你几乎只是激活一个env,运行构建(python setup.py bdist_wheel来制作一个.whl文件),为另一个Python版本激活下一个env,运行构建,依此类推。您最终得到的滚轮文件(*.whl)可以复制到其他计算机,然后直接pip install blah.whl

使用库存Python也是可管理的,但需要更多的工作。对于Python 2.7,您需要安装 Windows SDK 7.0 ,对于Python 3.4,您需要 Windows SDK 7.1 。这些SDK提供了为x86和x64构建的编译器。不幸的是,对于Python 3.5,你需要一个不同的东西, Visual Studio 2015 。我的博客有一个short entry,详细介绍了如何设置2.7和3.4。 (我仍需要将其更新为3.5)。

有一些工具可以让您更轻松地直接编译.pyx文件。 Cython本身提供了一个命令行工具cythonize,您可以使用它来构建这样的文件:

> cythonize -b blah.pyx

还有其他工具,比如我的easycython,它提供的功能不仅仅是cythonize,但是它有一些便利,例如默认情况下可选的numpy支持和优化的编译器标志。无论哪种方式,您都可以复制.pyd扩展模块本身并将其放在Python路径上的某个位置。但车轮更好。