2014-01-05 91 views
3

我在Windows 7上使用py2exe来制作一个使用psutil的应用程序。我正在使用Python 2.7。我正在制作一个文件可执行文件。当我尝试用psutil编译python python程序时,它说:如何在py2exe中找不到py2exe找不到的psutil组件?

The following modules appear to be missing 
['_psutil_bsd', '_psutil_linux', '_psutil_osx', '_psutil_posix', '_psutil_sunos', '_scproxy', '_sysconfigdata', 'builtins'] 

但是,程序编译得很好。当我运行编译的程序,它崩溃并生成一个日志文件:

回溯(最近通话最后一个): 文件“TaskManager.py”,第27行,在 文件“zipextimporter.pyc”,行82,在load_module 文件 “psutil__init __。PYC”,管线135,在 文件 “zipextimporter.pyc”,线82,在load_module 文件 “psutil_psmswindows.pyc”,第14行,在 文件 “zipextimporter.pyc”,线路98,在load_module 导入错误:MemoryLoadLibrary未能加载_psutil_mswindows.pyd

我曾尝试在设置选项部分上市:

"includes": ["_psutil_mswindows.pyd"] 

以及刚刚

"includes": ["psutil"] 

我也曾尝试包括所有的模块py2exe列为失踪。除了包含psutil,它没有做任何事情,py2exe找不到这些文件。

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

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

+0

刚刚遇到同样的问题。它看起来像pyd文件被正确打包,它在library.zip中找到。我正在调查。 – dotz

+4

当我在Windows 8的64位安装中使用py2exe打包psutil,然后尝试在Windows XP Home Edition 32位上运行该exe文件时,发生此问题。我所做的是,我将整个构建过程移至Windows XP(32位),并且问题自行解决。我昨天在网上的某个地方发现了这个建议,所以关于这个bug起源的想法不是我的。我们正在讨论一个问题,文件_psutil_mswindows.pyd被打包(可以在library.zip中找到)。 – dotz

+1

我实际上只是用pyinstaller来代替。它工作得很好。 –

回答

3

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

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

dll_excludes=['msvcr71.dll', "IPHLPAPI.DLL", "NSI.dll", "WINNSI.DLL", "WTSAPI32.dll"] 

你可以看一看/交叉引用与您的系统文件夹中找到了哪些它包含一个列表,不应存在该.dll。

+0

再次感谢你,这解决了我们的问题以及通过包括此选项冻结psutil –

1

我遇到这样的:

ImportError: MemoryLoadLibrary failed loading psutil\_psutil_windows.pyd 

它是从文件名中的问题,不同的一点点。

阅读psutil的源代码后,我想通了,根本原因: 目标psutil的Windows平台取决于哪个平台它是建立在 。

以下代码存在于_psutil_windows.c中,提示GetIfEntry2被引用。您可以通过在Windows XP上运行depend.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 

并设置。

# 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), 
    ]) 

因此,解决这个问题的选项有:

  1. 在Windows XP计算机生成psutil,或
  2. 修改setup.py PY根据当前系统环境是这样产生的宏根据需要使用目标Windows平台版本。