当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《将预编译的Cython代码分发给Windows》经验,为你挑选了1个好方法。

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

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

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

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

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路径上的某个位置.但车轮更好.



1> Caleb Hattin..:

是的,您可以期望二进制.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路径上的某个位置.但车轮更好.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有