3

我正在尝试将.cCython 创建的文件编译为.pyd使用Microsoft Windows SDKcl.exe附带的文件。

由于这是在 Windows 7 64 位下为 Python 2.7 64 位构建 Cython 的推荐包,我认为使用相同的编译器来创建.pyd文件是个好主意。

我当前的通话使用了一个cythoncc.bat文件:

set CLPATH="C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64\cl.exe"
SET INCLUDE="C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include";"C:\Program Files\Microsoft SDKs\Windows\v7.0\Include";"C:\Python27\include";"C:\Python27\Lib\site-packages\numpy\core\include";
SET LIB="C:\Python27\libs";"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib\amd64";"C:\Program Files\Microsoft SDKs\Windows\v7.0\Lib\x64";
SET CFLAGS="/O2 /favor:<INTEL64>"
%CLPATH% %CFLAGS% /Fo%1.pyd %2.c

我认为问题出在最后一行,但还不确定......它给了我错误:

/out:_conecyl.exe
_conecyl.pyd
   Creating library _conecyl.lib and object _conecyl.exp
LIBCMT.lib(crt0.obj) : error LNK2019: unresolved external symbol main referenced
 in function __tmainCRTStartup
_conecyl.exe : fatal error LNK1120: 1 unresolved externals

并创建一个.pyd加一个.lib文件。

任何帮助将不胜感激!谢谢!

4

2 回答 2

3

使用文档此处setup.py说明的配方


Saullo 编辑:

setup.py看起来就像这样:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [Extension("_conecyl", ["_conecyl.pyx"])]

setup(
  name = '_conecyl',
  cmdclass = {'build_ext': build_ext},
  ext_modules = ext_modules
)

通过以下调用,它可以完美运行:

setenv /x64 / release
set INCLUDE=%INCLUDE%;C:\Python27\include;C:\Python27\Lib\site-packages\numpy\core\include
set LIB=%LIB%;C:\Python27\libs
set DISTUTILS_USE_SDK=1
python setup.py install
于 2013-08-11T09:54:02.573 回答
1

我一直在与 Windows 上的 Cython pyd 创建作斗争,并有一个可行的解决方案。这篇文章在搜索“构建 cython pyd 视觉工作室窗口”时排名很高,所以我想我会添加我的方法来拯救人们的愤怒和眼泪。

我的要求如下:

  • 我的大部分代码都是用 PyCharm 用 Python 编写的
  • 我使用 Cython 来加速某些涉及固定大小的浮点数组的计算
  • 调试 Cython(这是另一个主题!)是可行的,但对用户不友好。我发现最好的方法是在我的 pyx 中不断添加/删除日志/打印语句并重新运行我的开发 Python 脚本。显然,我想要一个快速的转变,从更改 pyx 文件到有一个链接的 pyd 文件再次在 Python 中使用。

这就是我所做的。假设我们要创建一个新的 Cython 模块:

  1. 创建一个包含构建和架构信息的 python 文件。例如functions_362_64.py。我现在用 Python 编写了一个很好的功能框架。我建议编写一些测试并让它们通过 - 一旦进入 Cython 空间,这将更加困难。您的测试使用 'from xxx.yyy.zzz.functions_362_64.py import my_function1' 等等。现在将文件名更改为“functions_362_64.pyx”。

  2. 运行 'cythonize.exe -a functions_362_64.pyx' 以创建 2 个文件。html 以人类可读的形式解释了 Cython 对您的代码所做的操作 - 它对于调试非常有用。您还可以在“functions_362_64.c”中获得 C 代码。

  3. 现在我们使用 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 文件 - 导入不会改变。

  1. 现在我们想要一个批处理文件来自动化一切——我的有 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 文件中添加:

  1. 删除 ...\functions.pyd
  2. python.exe setup.py build_ext --inplace
  3. 删除 ...\functions.c
  4. 重命名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 一起工作。

于 2017-08-22T21:40:32.037 回答