cx_freeze 不导入外部模块

Posted

技术标签:

【中文标题】cx_freeze 不导入外部模块【英文标题】:cx_freeze not importing external modules 【发布时间】:2014-02-27 16:40:55 【问题描述】:

我选择尝试使用 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 以添加包含选项,但没有任何区别。

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)

【问题讨论】:

你能显示冻结应用程序的输出吗?另外,这些包裹是用拉链鸡蛋包装的吗? cx_Freeze 目前无法在压缩鸡蛋中找到模块,但我有 a pull request 来解决这个问题。 【参考方案1】:

找到外部模块的 .pyd 文件。将其复制并粘贴到构建文件中。因此,例如,如果它正在寻找 _cpyHook(我遇到了与您相同的问题,并且它说模块丢失了),请转到 C:\Python33\Lib\site-packages\pyHook 并将文件复制并粘贴到 C :\Python33\build\exe.win-amd64-3.3.

【讨论】:

【参考方案2】:

尝试在构建选项中明确列出缺少的包,如下所示:

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

如果您需要在构建中包含其他(非 Python)文件,请参阅this question 的已接受答案。

编辑:我终于有时间再看看这个,这似乎是一个棘手的问题。如果时间允许,我会继续研究它,但我想我会发布我的发现,以防它们对 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,然后一切似乎都正常了。它只是无法从cx_Freeze 生成的library.zip 文件中加载pyHook。我以前曾见过这种问题,并通过在加载任何模块之前在我的***脚本中修改sys.path 来解决它。我会看看我是否可以挖掘其中一个例子。与此同时,也许这个建议会对 OP 有所帮助:尝试解压缩 zip 文件,看看它是否有所作为。需要注意的几点:

导入pywin32 没有任何问题,只有pyHook确实尝试在构建选项中设置create_shared_zip=Falseinclude_in_shared_zip=False,但这只会导致文件名为logger.zip 而不是library.zip。 (奇怪。我不敢相信这不是错误。)

【讨论】:

抱歉,我认为您需要在 buildOptions 字典中设置 includes 而不是 packages。我目前无法验证这一点,但我会尽快检查并更新我的答案。 刚刚更新了我的主要帖子,添加了包含,但是 pyHook 和 pywin32 仍未正确导入。

以上是关于cx_freeze 不导入外部模块的主要内容,如果未能解决你的问题,请参考以下文章

cx_Freeze 无法包含 Cython .pyx 模块

cx_Freeze 不工作 - 没有名为 cx_Freeze 的模块

cx_Freeze 错误模块 SSL 不可用 Python 3.7 Windows 10

火力基地部署;导致“无法在模块外部使用导入”[不重复]

cx_Freeze ImportError:无法导入名称

cx_Freeze 没有名为“Tkinter”的模块