对于一堂课,我写了一个数值问题的求解器.我的代码运行在一个IPython笔记本中,其中大部分代码都是纯Python + NumPy + matplotlib,但性能关键部分是用Cython编写的(并包含在IPython %%cython
魔法中).教授喜欢我的解决方案,并要求我向一些本科学生提供,他将在另一个班级教授类似的主题作为参考资料.问题是,我不确定分发代码的最佳方式是什么.
我的主要问题是,大多数学生可能会运行Windows.在Windows上编译Cython代码是我最后一次做的噩梦,因为你必须与几个不同的C编译器混在一起,直到找到一个有效的编译器.对于想要运行我的笔记本以获得有效的Cython环境的每个学生来说,绝对不能期望它.
我有想法在Windows机器上预编译代码的Cython部分(它不需要由学生更改)并分发pyd文件.所以我的问题是:
Caleb Hattin.. 7
是的,您可以期望二进制.pyd
文件在不同的Windows机器上运行,只要python版本与编译Cython模块的版本匹配,包括x86/x64差异.
在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.我的博客有一个简短的条目,详细介绍了如何设置2.7和3.4.(我仍需要将其更新为3.5).
有一些工具可以让您更轻松地.pyx
直接编译文件.Cython本身提供了一个命令行工具,cythonize
您可以使用它来构建这样的文件:
> cythonize -b blah.pyx
还有其他工具,比如我的easycython,它提供的功能不多cythonize
,但是有一些便利,比如默认情况下可选的numpy支持和优化的编译器标志.无论哪种方式,您都可以复制.pyd
扩展模块本身并将其放在Python路径上的某个位置.但车轮更好.
是的,您可以期望二进制.pyd
文件在不同的Windows机器上运行,只要python版本与编译Cython模块的版本匹配,包括x86/x64差异.
在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.我的博客有一个简短的条目,详细介绍了如何设置2.7和3.4.(我仍需要将其更新为3.5).
有一些工具可以让您更轻松地.pyx
直接编译文件.Cython本身提供了一个命令行工具,cythonize
您可以使用它来构建这样的文件:
> cythonize -b blah.pyx
还有其他工具,比如我的easycython,它提供的功能不多cythonize
,但是有一些便利,比如默认情况下可选的numpy支持和优化的编译器标志.无论哪种方式,您都可以复制.pyd
扩展模块本身并将其放在Python路径上的某个位置.但车轮更好.