cx_freeze не импортирует внешние модули

Я решил попробовать использовать cx_freeze, который преобразует мой простой кейлоггер python 3.x в exe. Я выбираю cx_freeze, потому что py2exe - это только python 2.x. Я компилирую свой код с помощью этого скрипта setup.py.

from cx_Freeze import setup, Executable

# Dependencies are automatically detected, but it might need
# fine tuning.
buildOptions = dict(packages = [], excludes = [])

base = 'Console'

executables = [
    Executable('logger.py', base=base, targetName = 'logger.exe')
]

setup(name='PyLogger',
      version = '0.1',
      description = 'A Simple Keylogger',
      options = dict(build_exe = buildOptions),
      executables = executables)

и я, когда компилирую свой код,

try:
    import pythoncom
except ImportError:
    input("Import Error, pywin32 is not installed")

try:
    import pyHook
except ImportError:
    input("Import Error, pyHook is not installed")

Я получаю сообщение об ошибке импорта, в котором говорится, что pywin32 и pyHook не установлены. Как вы импортируете внешние модули в cx_freeze.

ИЗМЕНИТЬ - Я попытался изменить setup.py, чтобы добавить параметр include, но это не имело никакого значения.

from cx_Freeze import setup, Executable

# Dependencies are automatically detected, but it might need
# fine tuning.
buildOptions = dict(packages = ['pyHook','pythoncom'],includes = ['pyHook','pythoncom'], excludes = [])

base = 'Console'

executables = [
    Executable('logger.py', base=base, targetName = 'logger.exe')
]

setup(name='PyLogger',
      version = '0.1',
      description = 'A Simple Keylogger',
      options = dict(build_exe = buildOptions),
      executables = executables)

person Coder77    schedule 27.02.2014    source источник
comment
Можете ли вы показать результат зависания вашего приложения? Кроме того, эти пакеты в яйцах на молнии? cx_Freeze в настоящее время не может найти модули в заархивированных яйцах, но у меня есть запрос на перенос, чтобы исправить это.   -  person Thomas K    schedule 02.03.2014


Ответы (2)


Найдите файл .pyd внешнего модуля. Скопируйте и вставьте это в файл сборки. Так, например, если он искал _cpyHook (у меня была та же проблема, что и у вас, и он сказал, что этот модуль отсутствует), перейдите в C: \ Python33 \ Lib \ site-packages \ pyHook и скопируйте и вставьте файл в C : \ Python33 \ build \ exe.win-amd64-3.3.

person hmnbvcxz    schedule 17.06.2014

Попробуйте явно указать недостающие пакеты в параметрах сборки, например:

buildOptions = dict(packages = ['pyHook', 'pywin32'], excludes = [])

И см. Принятый ответ на этот вопрос, если вам нужно включить в свою сборку другие файлы (не на Python).

РЕДАКТИРОВАТЬ: наконец-то у меня появилось время взглянуть на это еще немного, и это кажется сложной проблемой. Я буду продолжать ковыряться в нем, пока позволяет время, но я подумал, что опубликую свои выводы на случай, если они будут полезны для OP. Я подозреваю, что модуль pyHook не работает нормально, когда он «заморожен», то есть когда он включен в zip-файл. Если я использую это setup.py:

from cx_Freeze import setup, Executable

buildOptions = dict(
    includes=['pythoncom'],
    packages=['pyHook']
)

executables = [
    Executable('logger.py', base='Console', targetName = 'logger.exe')
]

setup(
    name='PyLogger',
    version = '0.1',
    description = 'A Simple Keylogger',
    options = dict(build_exe = buildOptions),
    executables = executables
)

сгенерированный logger.exe не работает - по крайней мере изначально - правильно и вызывает ошибку:

Import Error, pyHook is not installed

Однако, если я запустил следующую команду из каталога, содержащего EXE:

unzip library.zip

и перезапустите logger.exe, тогда вроде все работает нормально. Он просто не может загрузить pyHook из library.zip файла, который создается cx_Freeze. Раньше я сталкивался с подобными проблемами и работал над их решением, изменяя sys.path в моем скрипте верхнего уровня перед загрузкой каких-либо модулей. Я посмотрю, смогу ли я откопать один из этих примеров. А пока, возможно, этот совет поможет OP: попробуйте разархивировать zip-файл и посмотреть, имеет ли это значение. Несколько замечаний:

  • У меня нет проблем с импортом pywin32, только pyHook
  • Я действительно попытался установить create_shared_zip=False и include_in_shared_zip=False в параметрах сборки, но в результате был получен файл с именем logger.zip вместо library.zip. (Странно. Не могу поверить, что это не ошибка.)
person evadeflow    schedule 27.02.2014
comment
Извините, я думаю, вам нужно установить includes, а не packages в вашем buildOptions dict. Я не нахожусь в том месте, где я могу проверить это в данный момент, но я проверю и обновлю свой ответ соответствующим образом, как только я это сделаю. - person evadeflow; 01.03.2014
comment
Только что обновил мой основной пост, добавив включения, однако pyHook и pywin32 по-прежнему не импортируются правильно. - person Coder77; 01.03.2014