将预编译的 Cython 代码分发到 Windows
Distribute pre-compiled Cython code to Windows
对于 class,我已经为一个数值问题编写了求解器。我的代码 运行s 在 IPython 笔记本中,其中大部分代码是纯 Python + NumPy + matplotlib,但性能关键部分是用 Cython 编写的(并包含在 IPython %%cython
魔法)。教授喜欢我的解决方案,并让我将其提供给一些本科生,他将在另一个 class 中教授类似主题作为参考 material。问题是,我不太确定分发我的代码的最佳方式是什么。
我的主要问题是,大多数学生可能 运行 Windows。在 Windows 上编译 Cython 代码是我上次做的噩梦,因为您将不得不使用几个不同的 C 编译器,直到找到一个可用的编译器。绝对不能指望每个想要 运行 我的笔记本获得工作 Cython 环境的学生。
我想到了在 Windows 机器上预编译 Cython 部分代码(不需要学生改动)并分发 pyd 文件。所以我的问题是:
我可以期望我在 Windows 上编译的 Cython 二进制文件可以在另一台 Windows 机器上使用吗?
是的,您可以期望二进制 .pyd
文件在不同的 Windows 机器上 运行,只要 python 版本与所针对的版本相匹配Cython 模块已编译,包括x86/x64 差异。
在 Windows 上构建扩展模块不再像以前那样困难。
最简单的方法是使用 Anaconda Python,它 在安装程序中包含一个编译器。它是目前可用的最接近 "Just Works" 的东西。它还可以很容易地为每个 Python 版本构建二进制版本,如有必要,使用 conda
命令行工具创建虚拟环境。您几乎只是激活一个环境,运行 构建(python setup.py bdist_wheel
制作一个 .whl
文件),为不同的 Python 版本激活下一个环境,运行 构建等。您最终得到的 wheel 文件 (*.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 路径的某个位置。但是轮子更好。
对于 class,我已经为一个数值问题编写了求解器。我的代码 运行s 在 IPython 笔记本中,其中大部分代码是纯 Python + NumPy + matplotlib,但性能关键部分是用 Cython 编写的(并包含在 IPython %%cython
魔法)。教授喜欢我的解决方案,并让我将其提供给一些本科生,他将在另一个 class 中教授类似主题作为参考 material。问题是,我不太确定分发我的代码的最佳方式是什么。
我的主要问题是,大多数学生可能 运行 Windows。在 Windows 上编译 Cython 代码是我上次做的噩梦,因为您将不得不使用几个不同的 C 编译器,直到找到一个可用的编译器。绝对不能指望每个想要 运行 我的笔记本获得工作 Cython 环境的学生。
我想到了在 Windows 机器上预编译 Cython 部分代码(不需要学生改动)并分发 pyd 文件。所以我的问题是:
我可以期望我在 Windows 上编译的 Cython 二进制文件可以在另一台 Windows 机器上使用吗?
是的,您可以期望二进制 .pyd
文件在不同的 Windows 机器上 运行,只要 python 版本与所针对的版本相匹配Cython 模块已编译,包括x86/x64 差异。
在 Windows 上构建扩展模块不再像以前那样困难。
最简单的方法是使用 Anaconda Python,它 在安装程序中包含一个编译器。它是目前可用的最接近 "Just Works" 的东西。它还可以很容易地为每个 Python 版本构建二进制版本,如有必要,使用 conda
命令行工具创建虚拟环境。您几乎只是激活一个环境,运行 构建(python setup.py bdist_wheel
制作一个 .whl
文件),为不同的 Python 版本激活下一个环境,运行 构建等。您最终得到的 wheel 文件 (*.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 路径的某个位置。但是轮子更好。