簡體   English   中英

如何在Py2exe中包含psutil的組件py2exe找不到?

[英]How to include components of psutil in py2exe that py2exe can't find?

我在Windows 7上使用py2exe來使用psutil制作應用程序。 我正在使用python 2.7。 我正在制作單個文件可執行文件。 當我嘗試用psutil編譯python python程序時,它接近結尾說:

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 \\ 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,以獲取其中包含的不應存在的列表。

我遇到了這個:

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

所以解決這個問題的方法是:

  1. 在Windows XP計算機上構建psutil,或
  2. 修改setup.py以使用目標Windows平台版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM