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

Я решил попробовать использовать cx_freeze, который преобразует мой простой кейлоггер Python 3.x в исполняемый файл. Я выбираю 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, чтобы добавить опцию включений, но это не имело никакого значения.

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)

2 ответа

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

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

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

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

РЕДАКТИРОВАТЬ: у меня наконец-то было время взглянуть на это немного больше, и это кажется сложной проблемой. Я продолжу ковыряться в этом, как позволит время, но я подумал, что опубликую свои выводы на случай, если они пригодятся ОП. Я подозреваю, что 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 в моем скрипте верхнего уровня до загрузки любых модулей. Я посмотрю, смогу ли я выкопать один из этих примеров. Тем временем, возможно, этот совет поможет ОП: попробуйте разархивировать zip-файл и посмотрите, будет ли он иметь значение. Несколько вещей, чтобы отметить:

  • У меня нет проблем с импортом pywin32, только pyHook
  • Я попробовал установить create_shared_zip=False а также include_in_shared_zip=False в опциях сборки, но это просто привело к файлу с именем logger.zip вместо library.zip, (Странно. Я не могу поверить, что это не ошибка.)
Другие вопросы по тегам