使用pyinstaller编译代码时,Python exec()无法正常工作

时间:2019-04-08 19:15:01

标签: python-3.x base64 pyinstaller

我正在尝试制作一个脚本,该脚本将解码一些base64编码的python脚本,然后使用pyInstaller进行编译以创建一个.exe文件。 我的代码如下:

import base64
exec(base64.b64decode(b"aW1wb3J0IHRpbWUKd2hpbGUgVHJ1ZToKICAgIHByaW50KCJIZWxsbyBUaGVyZSIpCiAgICB0aW1lLnNsZWVwKDEpCg==""))

当我运行.py文件时,代码成功运行,但是当我将代码编译成.exe文件时,什么都没有发生。我看着任务管理器,即使等待了大约5分钟,我的过程甚至都没有打开。 我也尝试使用compile()编译代码,但还是没有运气。 对于任何想知道base64编码的字符串说的人:

import time
while True:
    print("Hello")
    time.sleep(1)

1 个答案:

答案 0 :(得分:0)

这是一篇较旧的帖子,但我可以回答其他可能发现此问题的人的问题。

这里发生的事情是捆绑的可执行文件缺少 time 库。根据 PyInstaller 的网站:

<块引用>

[Pyinstaller] 分析您的代码以发现您的脚本需要执行的所有其他模块和库。然后它收集所有这些文件的副本——包括活动的 Python 解释器! – 并将它们与您的脚本放在一个文件夹中,或者可以选择放在一个可执行文件中。

...

<块引用>

您的脚本还需要哪些其他模块和库才能运行? (这些有时称为其“依赖项”。)

<块引用>

为了找出答案,PyInstaller 会在您的脚本中查找所有导入语句。它会查找导入的模块并在其中查找导入语句,以此类推,直到它拥有您的脚本可能使用的模块的完整列表。

因为您在编码字符串中包含了导入语句,PyInstaller 无法找到 time 作为依赖项。因此,time 库不在执行代码的环境中。

要解决此问题,您可以执行以下 2 件事之一:

  1. 解决此问题的更简单方法是在导入 base64 库的外部代码中导入 time

  2. 更难的方法是将整个 time 库存储在一个可执行的 Python 代码对象中,将其转换为 base64,并将其包含在您的其余内部代码中。

相关问题