对于一堂课,我写了一个数值问题的求解器。我的代码运行在一个IPython笔记本中,其中大部分代码都是纯Python + NumPy + matplotlib,但性能关键部分是用Cython编写的(并包含在IPython %%cython
魔法中)。教授喜欢我的解决方案,并要求我向一些本科生提供,他将在另一个班级教授类似的主题作为参考资料。问题是,我不确定分发代码的最佳方式是什么。
我的主要问题是,大多数学生可能都在运行Windows。在Windows上编译Cython代码是我最后一次做的噩梦,因为你必须与几个不同的C编译器一起玩,直到找到一个有效的编译器。对于想要运行我的笔记本以获得有效的Cython环境的每个学生来说,绝对不能期待它。
我有想法在Windows机器上预编译代码的Cython部分(它不需要由学生更改)并分发pyd文件。所以我的问题是:
答案 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路径上的某个位置。但车轮更好。