py2exe MemoryLoadLibrary 加载失败 _ssl.pyd,Win7<->Win10
py2exe MemoryLoadLibrary failed loading _ssl.pyd, Win7<->Win10
简介
我有一个使用 SSL 并使用 py2exe 构建的脚本(bundle_files=1,将所有内容打包到 *.exe 中)
现在我遇到了这个问题
运行 Win7 上的 py2exe 创建一个 *.exe,它将 运行 在 Win7 和 Win10
运行 Win10 上的 py2exe 创建一个 *.exe,它将在 Win10 中 运行 但在 Win7 中产生此错误:
ImportError: MemoryLoadLibrary failed loading _ssl.pyd
解决方法
将 bundle_files 设置为 3(不打包)将生成一个 *.exe,它在 Win7 中运行良好,即使它是在 Win10 上构建的。
我尝试了一些 py2exe 选项,当更改 bundle_files 时,它突然起作用了。 但是我不明白为什么。
我的设置
- python 32 位 2.7.11
- ssl.OPENSSL_VERSION => 'OpenSSL 1.0.2d 9 Jul 2015'
- py2exe 0.6.9
两台机器(win7 和 win10)相同。
这是重现它的最小演示:
demo.py
import ssl
print "import done"
可以用这个构建
exebuilder.py
from distutils.core import setup
import py2exe
import sys
sys.argv.append("py2exe") # run py2exe (instead of supplying the command line argument)
# exclude some DLLs
dll_excludes = [
# win9x leftovers
"w9xpopen.exe",
# don't import these - otherwise win7 created *.exe won't work in winXP
#
"mswsock.dll",
"powrprof.dll"
]
sys.argv.append("--dll-excludes=%s" % ",".join(dll_excludes))
app_name = "win10ssl"
params = {
'zipfile': None, # pack everything into the *.exe
'options': {
"py2exe": {
"compressed": 1,
"optimize": 2,
# bundle_files
# 1 = EVERYTHING packed into the *.exe
# 2 = everything except for the pythonXX.dll
# 3 = don't pack
"bundle_files": 3
}
},
'version': "0.0.1.0",
'description': "demo to show MemoryLoadLibrary error",
'name': app_name,
'console': [{
"script": "demo.py",
"dest_base": app_name
}
]
}
setup(**params)
将 "crypt32.dll" 和 "mpr.dll" 添加到您的 dll_excludes。这些由 _ssl.pyd 在 Python 的较新版本(例如 2.7.11)中加载。但是这些库是 Windows 系统库和 OS 版本相关的,因此它们不应与您的项目一起打包和分发。 Win7 "crypt32.dll" 可能适用于 Win10,但 Win10 "crypt32.dll" 很可能不适用于 Win7。
简介
我有一个使用 SSL 并使用 py2exe 构建的脚本(bundle_files=1,将所有内容打包到 *.exe 中)
现在我遇到了这个问题
运行 Win7 上的 py2exe 创建一个 *.exe,它将 运行 在 Win7 和 Win10
运行 Win10 上的 py2exe 创建一个 *.exe,它将在 Win10 中 运行 但在 Win7 中产生此错误:
ImportError: MemoryLoadLibrary failed loading _ssl.pyd
解决方法
将 bundle_files 设置为 3(不打包)将生成一个 *.exe,它在 Win7 中运行良好,即使它是在 Win10 上构建的。
我尝试了一些 py2exe 选项,当更改 bundle_files 时,它突然起作用了。 但是我不明白为什么。
我的设置
- python 32 位 2.7.11
- ssl.OPENSSL_VERSION => 'OpenSSL 1.0.2d 9 Jul 2015'
- py2exe 0.6.9
两台机器(win7 和 win10)相同。
这是重现它的最小演示:
demo.py
import ssl
print "import done"
可以用这个构建
exebuilder.py
from distutils.core import setup
import py2exe
import sys
sys.argv.append("py2exe") # run py2exe (instead of supplying the command line argument)
# exclude some DLLs
dll_excludes = [
# win9x leftovers
"w9xpopen.exe",
# don't import these - otherwise win7 created *.exe won't work in winXP
#
"mswsock.dll",
"powrprof.dll"
]
sys.argv.append("--dll-excludes=%s" % ",".join(dll_excludes))
app_name = "win10ssl"
params = {
'zipfile': None, # pack everything into the *.exe
'options': {
"py2exe": {
"compressed": 1,
"optimize": 2,
# bundle_files
# 1 = EVERYTHING packed into the *.exe
# 2 = everything except for the pythonXX.dll
# 3 = don't pack
"bundle_files": 3
}
},
'version': "0.0.1.0",
'description': "demo to show MemoryLoadLibrary error",
'name': app_name,
'console': [{
"script": "demo.py",
"dest_base": app_name
}
]
}
setup(**params)
将 "crypt32.dll" 和 "mpr.dll" 添加到您的 dll_excludes。这些由 _ssl.pyd 在 Python 的较新版本(例如 2.7.11)中加载。但是这些库是 Windows 系统库和 OS 版本相关的,因此它们不应与您的项目一起打包和分发。 Win7 "crypt32.dll" 可能适用于 Win10,但 Win10 "crypt32.dll" 很可能不适用于 Win7。