我一直在与 Windows 上的 Cython pyd 创建作斗争,并有一个可行的解决方案。这篇文章在搜索“构建 cython pyd 视觉工作室窗口”时排名很高,所以我想我会添加我的方法来拯救人们的愤怒和眼泪。
我的要求如下:
- 我的大部分代码都是用 PyCharm 用 Python 编写的
- 我使用 Cython 来加速某些涉及固定大小的浮点数组的计算
- 调试 Cython(这是另一个主题!)是可行的,但对用户不友好。我发现最好的方法是在我的 pyx 中不断添加/删除日志/打印语句并重新运行我的开发 Python 脚本。显然,我想要一个快速的转变,从更改 pyx 文件到有一个链接的 pyd 文件再次在 Python 中使用。
这就是我所做的。假设我们要创建一个新的 Cython 模块:
创建一个包含构建和架构信息的 python 文件。例如functions_362_64.py。我现在用 Python 编写了一个很好的功能框架。我建议编写一些测试并让它们通过 - 一旦进入 Cython 空间,这将更加困难。您的测试使用 'from xxx.yyy.zzz.functions_362_64.py import my_function1' 等等。现在将文件名更改为“functions_362_64.pyx”。
运行 'cythonize.exe -a functions_362_64.pyx' 以创建 2 个文件。html 以人类可读的形式解释了 Cython 对您的代码所做的操作 - 它对于调试非常有用。您还可以在“functions_362_64.c”中获得 C 代码。
现在我们使用 Visual Studio 创建 pyd。阅读有关获取匹配版本的所有内容。我目前使用 MSVS2017 和 Python32。创建一个空白解决方案。为每个 pyd 文件创建一个 C++ dll 项目。所以在这里我们创建了一个名为“functions_362_64”的项目。进行以下更改以获得有用的编译和链接:
- 包含来自 Python venv 的目录
- Python 环境中的 libs 目录
- 将输出名称更改为 pyd
- 在发布版本中链接调试符号
- 没有预编译的头文件
- 在完成测试之前,不要进行短期构建或优化
- 将您的 pyd/pbd 复制到 Python 导入目录的构建后步骤 这都是非常标准的东西(您可以在许多 MSVS 帖子中找到它)。
你现在应该有 'functions_362_64.pyd' 和 'functions_362_64.pdb'。检查它是否可以代替您的原始 py 文件 - 导入不会改变。
- 现在我们想要一个批处理文件来自动化一切——我的有 8 行。您需要做的是获取 Visual Studio 在您的项目中使用的构建命令。转到工具->选项->项目和解决方案->构建和运行->输出详细程度并设置为详细。构建项目并搜索 PATH、LIB、LIBPATH、INCLUDE、cl.exe 和复制的成功输出。然后将正确的行粘贴到您的批处理文件中,并在需要的地方添加“”和“SET”。我的看起来像这样:
- 第 1 行:“C:...your_path...\Scripts\cythonize.exe”-a “C:...your_path...\functions_362_64.pyx”
- 第 2 行:SET PATH=C:..... 从构建输出粘贴.....
- 第 3 行:SET LIB=C:..... 从构建输出粘贴......
- 第 4 行:SET LIBPATH=C:..... 从构建输出粘贴......
- 第 5 行:SET INCLUDE=C:..... 从构建输出粘贴 .....
- 第 6 行:“C:...microsoft_path...\CL.exe”/c ..... 从构建输出粘贴 ...
- 第 7 行:复制 /Y "C:..... 构建后复制 pyd .....
- 第 8 行:复制 /Y "C:..... 构建后复制 pdb .....
将此 .bat 放在您的 Visual Studio 项目目录中。得到一个命令提示符坐在那里。
现在你拥有了一切:
- 更改 pyx 文件
- 运行.bat
- 再次运行 Python
这一切都很快。您甚至可以将 PyCharm 或任何用于运行此脚本的 IDE 作为外部工具。我发现继续运行 .bat 文件更容易。
好吧,我希望这可以为你们节省一些时间和麻烦。在让这个过程正常工作之前,我几乎正在考虑切换到 linux ...... :)
谢谢,LJHW
作者修订: 2017 年 8 月 23 日
我现在使用 x86 或 x64 Visual Studio Native Tools 命令提示符——我认为这些都带有 SDK 安装以及完整的 MSVS。这解决了所有的 ENV 问题,这似乎是导致大多数人问题的原因。通过这样做,一切都以跨平台的方式开箱即用,这样就不会实施特定的 Windows hack。我也做了一些整理,所以我使用了一个 .bat 文件。
- 将 windows_setup.bat 添加到包目录
- 在 VS Native 提示符下运行
在这个 .bat 文件中添加:
- 删除 ...\functions.pyd
- python.exe setup.py build_ext --inplace
- 删除 ...\functions.c
- 重命名functions.cp36-win_amd64.pyd functions.pyd
现在,我只是将 pyx 转换为 pyd 并且没有中间文件。python.exe 的架构必须与 cmd.exe 匹配。这样做的好处是你可以在网上运行所有基于 linux 的示例——你只需相应地更新你的 setup.py 文件,setuptools/disutils 将处理 Windows 特定的东西,因为你有正确的 ENV 设置本机提示。
所以为了发展,我去:
- 更改 pyx 文件
- 运行 windows_setup.bat
- 再次用python代码开发
如果我需要调试,我不会删除 c 文件,在 Visual Studio 中加载 functions.c 并按照上面原始帖子中的描述构建 pdb。我不明白为什么只使用 10.0 本机提示,这个系统就不能与 Python32 和 MSVC10 一起工作。