这可能是由于在路径上安装了 32 位和 64 位 Python 造成的。
仔细查看输出python setup.py py2exe
. . .
*** copy extensions ***
copying C:\Python27\DLLs\_hashlib.pyd -> C:\path\to\project\dist
copying C:\Python27\DLLs\_socket.pyd -> C:\path\to\project\dist
copying C:\Python27\DLLs\_ssl.pyd -> C:\path\to\project\dist
copying C:\Python27\DLLs\bz2.pyd -> C:\path\to\project\dist
copying C:\Python27\DLLs\select.pyd -> C:\path\to\project\dist
copying C:\Python27\DLLs\unicodedata.pyd -> C:\path\to\project\dist
copying C:\PythonEnvs\some_virtualenv\lib\site-packages\pyodbc-3.0.7-py2.7-win32.egg\pyodbc.pyd -> C:\path\to\project\dist
copying C:\PythonEnvs\some_virtualenv\lib\site-packages\win32\win32print.pyd -> C:\path\to\project\dist
*** copy dlls ***
copying C:\Windows\system32\python27.dll -> C:\path\to\project\dist
setting sys.winver for 'C:\path\to\project\dist\python27.dll' to 'ProjectNameHere'
copying C:\PythonEnvs\some_virtualenv\lib\site-packages\pywin32_system32\pywintypes27.dll -> C:\path\to\project\dist
copying C:\Windows\system32\CRYPT32.dll -> C:\path\to\project\dist
copying C:\PythonEnvs\some_virtualenv\lib\site-packages\py2exe-0.6.9-py2.7-win32.egg\py2exe\run.exe -> C:\path\to\project\dist\mlr_startup.exe
确保 py2exe 只从你想要的地方拉取。
在上面的运行示例中,py2exe 正在从 Python 2.7 的系统安装中提取,C:\Python27
. 它还从当前的虚拟环境中引入,C:\PythonEnvs\some_virtualenv\lib\site-packages
. 这将产生一个工作可执行文件。
当我遇到这个问题时,我看到 py2exe 也在从其他地方拉取东西,这些地方有不兼容的 Python 版本。
例如,我有 32 位的官方 Python,然后安装了 64 位版本的 Mercurial。Mercurial 安装了它自己的 64 位版本的 Python,而 py2exeC:\Python27
从C:\Program Files\Mercurial\Python27
.
为了解决这个问题,我刚刚卸载了 Mercurial。或者,您可以修改 Python 路径,以便 py2exe 不知道安装 Mercurial 的 Python 版本或任何其他不受欢迎的 Python 安装。