2014-01-05 130 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平臺版本。