介绍

我有一个使用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,即使在Win10上构建,它也可以在Win7中正常工作。

我尝试了一些py2exe选项,并且在更改bundle_files时突然起作用了。但是我不明白为什么。

我的设定


python 32位2.7.11
ssl.OPENSSL_VERSION =>'OpenSSL 1.0.2d 2015年7月9日'
py2exe 0.6.9


两台计算机上均相同(win7和win10)。

这是重现它的最小演示:

演示

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
    # http://stackoverflow.com/questions/1979486/py2exe-win32api-pyc-importerror-dll-load-failed
    "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在2.7.11等较新版本的Python中加载。但是这些库是Windows系统库和OS版本相关的,因此不应与项目一起打包和分发。 Win7“ crypt32.dll”可能在Win10上可以运行,但是Win10“ crypt32.dll”很可能在Win7上不能运行。

关于python - py2exe MemoryLoadLibrary无法加载_ssl.pyd,Win7 <-> Win10,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37273476/

10-12 13:54