2014-01-05 4 views
3

Я использую py2exe для Windows 7, чтобы сделать приложение с помощью psutil. Я использую python 2.7. Я делаю один исполняемый файл. Когда я пытаюсь скомпилировать программу Python Python с psutil, ближе к концу он говорит:Как включить компоненты psutil в py2exe, которые py2exe не может найти?

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

Однако программа отлично компилируется. При запуске скомпилированной программы, он выходит из строя и создает файл журнала:

Traceback (самый последний вызов последним): Файл «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 ImportError: MemoryLoadLibrary не удалось загрузить _psutil_mswindows.pyd

Я попытался указать в параметрах часть установки:

"includes": ["_psutil_mswindows.pyd"] 

, а также просто

"includes": ["psutil"] 

Я также попробовал, включая все модули py2exe числятся пропавшими без вести. За исключением включения psutil, который ничего не сделал, py2exe не смог найти эти файлы.

Удивительное количество похожих вопросов по этой теме в Интернете, но ни один из них не имеет хороших ответов (если вообще есть ответы), и многие из ошибок - это не та проблема, которая у меня есть.

Обновление: как ни странно, я нашел _psutil_mswindows.pyd в build \ bdist.win32 \ winexe \ collect-2.7 каталога сборки py2exe. Я думаю, по какой-то причине он не упакован должным образом.

+0

Просто нажмите ту же проблему. Похоже, файл pyd упакован правильно, он находится в library.zip. Я расследую. – dotz

+4

Эта проблема возникла, когда я упаковал psutil с py2exe в 64-разрядную установку Windows 8, а затем попытался запустить exe-файл на 32-разрядной версии Windows XP Home Edition. Я сделал это, я перевел весь процесс сборки на Windows XP (32-разрядный), и проблема решена сама. Вчера я нашел это предложение где-то в сети, поэтому идея о происхождении ошибки не моя. Мы говорим о проблеме, когда файл _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 зависит, на какой платформе он построен на.

Следующий код существует в _psutil_windows.c, предлагая ссылку GetIfEntry2. Вы легко можете это подтвердить, запустив файл depend.exe для загрузки _psutil_windows.pyd в Windows XP.

#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. Сложение psutil на XP машины Windows, или
  2. Изменить setup.py использовать целевую версию платформы Windows по мере необходимости.
Смежные вопросы