前言

在使用PyInstaller加密打包程序时,遇到了打包程序无法启动的问题。

查阅资料后发现是因PyCrypto未能正确安装。

首先尝试了安装替代品PyCryptoDome,后来发现并不可行。

然后编译安装PyCrypto时又出现了无法安装的问题,再以此记录。

正文

遇到以下错误:

  ...省略部分无关内容...
    C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -Isrc/ -Isrc/inc-msvc/ -Ic:\users\hsojo\appdata\local\programs\python\python37\include -Ic:\users\hsojo\appdata\local\programs\python\python37\include "-IC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE" "-IC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\ATLMFC\INCLUDE" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\8.1\include\shared" "-IC:\Program Files (x86)\Windows Kits\8.1\include\um" "-IC:\Program Files (x86)\Windows Kits\8.1\include\winrt" /Tcsrc/winrand.c /Fobuild\temp.win-amd64-3.7\Release\src/winrand.obj
    winrand.c
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(26): error C2061: 语法错误: 标识符“intmax_t”
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(27): error C2061: 语法错误: 标识符“rem”
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(27): error C2059: 语法错误:“;”
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(28): error C2059: 语法错误:“}”
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(30): error C2061: 语法错误: 标识符“imaxdiv_t”
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(30): error C2059: 语法错误:“;”
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(40): error C2143: 语法错误: 缺少“{”(在“__cdecl”的前面)
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(41): error C2146: 语法错误: 缺少“)”(在标识符“_Number”的前面)
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(41): error C2061: 语法错误: 标识符“_Number”
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(41): error C2059: 语法错误:“;”
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(42): error C2059: 语法错误:“)”
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(45): error C2143: 语法错误: 缺少“{”(在“__cdecl”的前面)
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(46): error C2146: 语法错误: 缺少“)”(在标识符“_Numerator”的前面)
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(46): error C2061: 语法错误: 标识符“_Numerator”
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(46): error C2059: 语法错误:“;”
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(46): error C2059: 语法错误:“,”
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(48): error C2059: 语法错误:“)”
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(50): error C2143: 语法错误: 缺少“{”(在“__cdecl”的前面)
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(56): error C2143: 语法错误: 缺少“{”(在“__cdecl”的前面)
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(63): error C2143: 语法错误: 缺少“{”(在“__cdecl”的前面)
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(69): error C2143: 语法错误: 缺少“{”(在“__cdecl”的前面)
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(76): error C2143: 语法错误: 缺少“{”(在“__cdecl”的前面)
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(82): error C2143: 语法错误: 缺少“{”(在“__cdecl”的前面)
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(89): error C2143: 语法错误: 缺少“{”(在“__cdecl”的前面)
    C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(95): error C2143: 语法错误: 缺少“{”(在“__cdecl”的前面)
    error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\BIN\\x86_amd64\\cl.exe' failed with exit status 2
    ----------------------------------------
ERROR: Command errored out with exit status 1: 'c:\applications\virtualenv\scripts\python.exe' -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\hsojo\\AppData\\Local\\Temp\\pip-install-7z9qwwcd\\pycrypto\\setup.py'"'"'; __file__='"'"'C:\\Users\\hsojo\\AppData\\Local\\Temp\\pip-install-7z9qwwcd\\pycrypto\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record 'C:\Users\hsojo\AppData\Local\Temp\pip-record-59ot1ulz\install-record.txt' --single-version-externally-managed --compile --install-headers 'c:\applications\virtualenv\include\site\python3.7\pycrypto' Check the logs for full command output.

这个错误与以前转的博客几乎一致。

首先安装VC++ Build Tools,然后执行以下命令指定CL环境变量。

export CL="/FI \"$VS140COMNTOOLS..\\..\\VC\\INCLUDE\\stdint.h\""

然后就可以正常通过pip安装PyCrypto了。