Python 如何在py2exe中包含py2exe可以';找不到?

Python 如何在py2exe中包含py2exe可以';找不到?,python,module,include,py2exe,Python,Module,Include,Py2exe,我正在windows 7上使用py2exe使用psutil制作应用程序。我正在使用python 2.7。我正在制作一个可执行文件。当我尝试用psutil编译python程序时,接近结尾时,它说: The following modules appear to be missing ['_psutil_bsd', '_psutil_linux', '_psutil_osx', '_psutil_posix', '_psutil_sunos', '_scproxy', '_sysconfigdata

我正在windows 7上使用py2exe使用psutil制作应用程序。我正在使用python 2.7。我正在制作一个可执行文件。当我尝试用psutil编译python程序时,接近结尾时,它说:

The following modules appear to be missing
['_psutil_bsd', '_psutil_linux', '_psutil_osx', '_psutil_posix', '_psutil_sunos', '_scproxy', '_sysconfigdata', 'builtins']
然而,该程序编译得很好。当我运行编译的程序时,它崩溃并生成一个日志文件:

回溯(最近一次呼叫最后一次): 文件“TaskManager.py”,第27行,在 加载模块中第82行的文件“zipextimporter.pyc” 文件“psutil\uuuu init\uuuuu.pyc”,第135行,在 加载模块中第82行的文件“zipextimporter.pyc” 文件“psutil_psmswindows.pyc”,第14行,在 加载模块中第98行的文件“zipextimporter.pyc” ImportError:MemoryLoadLibrary加载失败\u psutil\u mswindows.pyd

我已尝试在设置的选项部分列出:

"includes": ["_psutil_mswindows.pyd"]
以及

"includes": ["psutil"]
我还尝试包括所有列为缺失的模块py2exe。除了包含psutil(它什么也不做)之外,py2exe找不到这些文件

网上有很多关于这个话题的类似问题,但没有一个有好的答案(如果有答案的话),而且很多错误都不是我的问题


更新:奇怪的是,我在py2exe的build目录的build\bdist.win32\winexe\collect-2.7中找到了_psutil_mswindows.pyd。我猜出于某种原因,它没有得到正确的打包。

所有这些问题都来自py2exe,包括一堆系统DLL

添加以下排除列表。(主要是最后4个)。解决了这个问题

dll_excludes=['msvcr71.dll', "IPHLPAPI.DLL", "NSI.dll",  "WINNSI.DLL",  "WTSAPI32.dll"]
您可以查看/交叉引用.dll与系统文件夹中找到的那些dll,以查找其中不应包含的那些dll的列表。

我遇到了以下问题:

ImportError: MemoryLoadLibrary failed loading psutil\_psutil_windows.pyd
这与文件名中的问题有点不同

阅读psutil的源代码后,我找到了根本原因: psutil的目标Windows平台取决于构建它的平台 打开。

以下代码存在于_psutil_windows.c中,表明引用了GetIfEntry2。通过在windows XP上运行depends.exe加载_psutil_windows.pyd,您可以轻松确认这一点

#if (_WIN32_WINNT >= 0x0600) // Windows Vista and above
        SecureZeroMemory((PVOID)pIfRow, sizeof(MIB_IF_ROW2));
        pIfRow->InterfaceIndex = pCurrAddresses->IfIndex;
        dwRetVal = GetIfEntry2(pIfRow);
#else // Windows XP
        pIfRow->dwIndex = pCurrAddresses->IfIndex;
        dwRetVal = GetIfEntry(pIfRow);
#endif
setup.py根据当前系统环境生成宏,如下所示:

# Windows
if WINDOWS:
    def get_winver():
        maj, min = sys.getwindowsversion()[0:2]
        return '0x0%s' % ((maj * 100) + min)

    macros.extend([
        # be nice to mingw, see:
        # http://www.mingw.org/wiki/Use_more_recent_defined_functions
        ('_WIN32_WINNT', get_winver()),
        ('_AVAIL_WINVER_', get_winver()),
        ('_CRT_SECURE_NO_WARNINGS', None),
        # see: https://github.com/giampaolo/psutil/issues/348
        ('PSAPI_VERSION', 1),
    ])
因此,解决这一问题的选择是:

  • 在Windows XP计算机上生成psutil,或
  • 修改setup.py以根据需要使用目标Windows平台版本

  • 只是碰到了同样的问题。pyd文件似乎已正确打包,它位于library.zip中。我正在调查。当我在64位安装的Windows 8上使用py2exe打包psutil,然后尝试在Windows XP Home Edition 32位上运行exe文件时,出现了此问题。我所做的是,我将整个构建过程移到了WindowsXP(32位),问题自行解决了。我昨天在网上的某个地方发现了这个建议,所以关于这个bug的起源的想法不是我的。我们讨论的是一个问题,文件_psutil_mswindows.pyd被打包(可以在library.zip中找到),实际上我只是使用了pyinstaller。经过一点工作,它工作得很好。@某人或其他人,这应该是答案……再次感谢您,通过包含此选项,这解决了我们的问题,也解决了冻结psutil的问题