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
, (Странно. Я не могу поверить, что это не ошибка.)