Python Cython与Visual Studio(Windoes SDK包)编译器cl.exe一起创建.pyd

Python Cython与Visual Studio(Windoes SDK包)编译器cl.exe一起创建.pyd,python,visual-studio,compilation,compiler-errors,cython,Python,Visual Studio,Compilation,Compiler Errors,Cython,我正在尝试使用随附的cl.exe将Cython创建的.c文件编译为.pyd文件 因为这是在Windows7 64位下为Python2.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:\Progr

我正在尝试使用随附的
cl.exe
将Cython创建的
.c
文件编译为
.pyd
文件

因为这是在Windows7 64位下为Python2.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
并创建一个
.pyd
和一个
.lib
文件


任何帮助都将不胜感激!谢谢大家!

使用和中解释的
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

我一直在与这个在Windows上创建的Cython pyd进行斗争,并找到了一个可行的解决方案。这篇文章是在搜索“build cython pyd visual studio windows”时出现的,所以我想我应该添加我的方法来避免人们的愤怒和眼泪

我的要求如下:

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

  • 创建一个包含构建和体系结构信息的python文件。e、 g.功能_362 _64.py。我现在用Python编写了一个很好的功能框架。 我建议写一些测试并让它们通过——一旦进入赛昂空间,这将更加困难。您的测试使用“from xxx.yyy.zzz.functions\u 362\u 64.py import my\u function1”等。现在将文件名更改为“functions_362_64.pyx”

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

  • 现在我们使用VisualStudio创建pyd。阅读有关获取匹配版本的所有内容。我目前将MSVS2017与Python32一起使用。创建一个空白的解决方案。为每个PYD文件创建一个C++ DLL项目。因此,我们在这里创建了一个名为“functions_362_64”的项目。进行以下更改以获得有用的编译和链接:

    • 包含Python venv中的目录
    • Python环境中的libs目录
    • 将输出名称更改为pyd
    • 发布版本中的链接调试符号
    • 没有预编译头
    • 在完成测试之前,不要进行短期构建或优化
    • 将pyd/pbd复制到Python导入目录的后期构建步骤 这些都是非常标准的东西(你可以在许多MSV帖子中找到)
  • 您现在应该有“functions_362_64.pyd”和“functions_362_64.pdb”。检查它是否在原始py文件的位置工作-导入不会更改

  • 现在我们需要一个批处理文件来自动化所有的事情-我的有8行。您需要做的是获取VisualStudio在项目中使用的构建命令。转到工具->选项->项目和解决方案->构建和运行->输出详细信息并设置为详细。生成项目并在成功输出中搜索PATH、LIB、LIBPATH、INCLUDE、cl.exe和copy。然后将正确的行粘贴到批处理文件中,并在需要的地方添加“”和“SET”。我的看起来像这样:
    • 第1行:“C:…您的\u路径…\Scripts\cythonize.exe”-a“C:…您的\u路径…\functions\u 362\u 64.pyx”
    • 第2行:设置路径=C:。。。。。从生成输出粘贴
    • 第3行:设置LIB=C:。。。。。从生成输出粘贴
    • 第4行:设置LIBPATH=C:。。。。。从生成输出粘贴
    • 第5行:集合包含=C:。。。。。从生成输出粘贴
    • 第6行:“C:…microsoft_路径…\CL.exe”/C。。。。。从生成输出粘贴
    • 第7行:复制/Y“C:…生成后复制pyd…”
    • 第8行:副本/Y“C:。。。。。生成后副本pdb
  • 将这个.bat放在VisualStudio项目目录中。获取一个命令提示符,让它坐在那里

    现在你拥有了一切:

    • 更改pyx文件
    • 快跑,蝙蝠
    • 再次运行Python
    一切都很快。您甚至可以使用PyCharm或任何IDE作为外部工具运行此脚本。我发现继续运行.bat文件更容易

    我希望这能帮你们省点时间和麻烦。在让这个过程正常工作之前,我几乎在考虑切换到linux……)

    谢谢, LJHW

    作者修订:2017年8月23日

    我现在使用x86或x64 Visual Studio本机工具命令提示符-我认为这些工具随SDK安装以及完整的MSV一起提供。这解决了所有的环境问题,这似乎是造成大多数人问题的原因。通过这样做,一切都以跨平台的方式开箱即用,这样就不会实施特定的windows黑客攻击。我还做了一些整理,所以我使用了一个.bat文件

    • 将windows_setup.bat添加到程序包目录
    • 在VS本机提示符中运行此命令
    在此.bat文件中添加:

  • del…\functions.pyd
  • python.exe setup.py build_ext--就地
  • del…\functions.c
  • 重命名functions.cp36-win_amd64.pyd functions.pyd
  • 现在,我已经简单地将pyx转换为pyd,并且没有中间文件。python.exe的体系结构必须与cmd.exe匹配。这样做的好处是,您可以在web上运行所有基于linux的示例—您只需相应地更新setup.py文件,setuptools/distils将处理windows特定的内容,因为您在本机提示符中具有正确的环境设置

    所以
    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