尝试使用 Cython 和 Visual Studio 2019 (3​​2/64bits link.exe) 从 python 文件构建可执行文件时出错

问题描述

我正在尝试使用 python 脚本为 win10 创建一个可执行文件:main.py,它导入模块 datatools.py

我创建了 cythonizer.py(下面的代码),使用 cython 将 .py 文件转换为 .c 和 .pyd 文件

from distutils.core import setup
from distutils.extension import Extension
from Cython.distutils import build_ext
from Cython.Compiler import Options


ext_modules = [
            Extension("datatools",["datatools.py"]),Extension("main",["main.py"]),]

for e in ext_modules:
    e.cython_directives = {'language_level': "3"}
    
Options.docstings = False 
Options.embed = "main" 

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

然后,在具有 Visual Studio 2019 社区的 win10 计算机上,我在“x64 Native Tools Command Prompt for VS2019”中运行以下命令:

python cythonizer.py build_ext --inplace
cl.exe /nologo /Ox /MD /W3 /GS- /DNDEBUG -IC:\Users\mme\AppData\Local\Programs\Python\python36\include -IC:\Users\mme\AppData\Local\Programs\Python\python36\PC datatools.c main.c /link /OUT:"myApp.exe" /SUBSYstem:CONSOLE /MACHINE:X64 /LIBPATH:C:\Users\mpa\AppData\Local\Programs\Python\python36\libs /LIBPATH:C:\Users\mpa\AppData\Local\Programs\Python\python36\PCbuild

这个过程曾经有效,我能够产生一个有效的 .exe 随着我开发这个东西,datatools.py 和 main.py 变得更重了。值得注意的是 datatools.py 现在包含大型词典和列表。

现在,当我运行第一个命令时出现错误(法语操作系统抱歉):

LINK : l'éditeur de liens 32 bits (C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\bin\HostX86\x64\link.exe) manque d'espace de tas et va redémarrer l'édition des liens avec un éditeur de liens 64 bits

LINK : redémarrage de l'édition des liens avec l'éditeur de liens 64 bits 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\bin\HostX64\x64\link.exe'

LINK : Fatal error LNK1104: impossible d'ouvrir le fichier 'C:\Users\mme\Documents\aircraft2020-v0.26\datatools.cp36-win_amd64.pyd'

error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.25.28610\\bin\\HostX86\\x64\\link.exe' Failed with exit status 1104

换句话说:

  • link.exe 在 32 位时失败,因为它在链接编辑过程中缺少空间并改为启动 64 位版本
  • 在 64 位中失败并出现致命错误 LNK1104:无法打开 .py 文件

我猜它曾经可以工作,因为 32 位链接器曾经就足够了。现在datatool.py太重了,32位链接器失败,然后64位链接器启动,但是这个发现文件被锁定,因为32位链接器打开了它,所以它失败了,因为它不能编辑它。

这个诊断是否正确,如果是,是否可以在我的 cythonizer.py 文件中放入一些指示立即使用 64 位链接器的内容

解决方法

我确认我的诊断是正确的,可以将文件拆分为多个较轻的文件以避免出现问题。

然后,DavidW 的建议(上面)也是正确的,在 cythoniser 脚本中添加以下行解决了问题。

from distutils import _msvccompiler
_msvccompiler.PLAT_TO_VCVARS['win-amd64'] = 'amd64'