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

Posted

技术标签:

【中文标题】尝试使用 Cython 和 Visual Studio 2019 (3​​2/64bits link.exe) 从 python 文件构建可执行文件时出错【英文标题】:Error while trying to build an executable from python files, using Cython and Visual Studio 2019 (32/64bits link.exe) 【发布时间】:2021-06-10 09:35:06 【问题描述】:

我正在尝试为win10制作一个可执行文件,来自python脚本: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 变得越来越重。 Notabilly datatools.py 现在包含大型字典和列表。

现在,当我运行第一个命令时,我得到了错误(French OS sorry):

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 位链接器的内容?

【问题讨论】:

有可能this question/answer might help - 这不是完全相同的错误消息,但我想知道解决方案是否相似 【参考方案1】:

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

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

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

【讨论】:

以上是关于尝试使用 Cython 和 Visual Studio 2019 (3​​2/64bits link.exe) 从 python 文件构建可执行文件时出错的主要内容,如果未能解决你的问题,请参考以下文章

VS2019下载

无法将 cpplist 导入 Cython?

Cython 扩展模块类方法不可见/命名 提及时出错

在 Cython 中使用 C++ STL 映射

Cython -std=c++11 错误,同时使用 C 和 C++

在 mac 上使用 cython 和 emscripten 将简单的 python 程序编译为 javascript