【问题标题】:How to compile multiple python files into single .exe file using pyinstaller如何使用 pyinstaller 将多个 python 文件编译成单个 .exe 文件
【发布时间】:2017-12-24 06:53:27
【问题描述】:

我在 python 中创建了一个 GUI(使用 Tkinter),它通过使用 os.system('python_file.py') 从 GUI 中单击一个按钮来运行 python 文件。我想通过将 Tkinter 文件保持为主文件,使用 pyinstaller 将所有这些 python 文件捆绑到单个 .exe 文件中。

我通过在命令行中执行以下操作创建了 .exe 文件:

pyinstaller --debug --onefile --noupx tkinter_app.py

目前我的 .spec 文件如下所示:

# -*- mode: python -*-

block_cipher = None

a = Analysis(['tkinter_app.py'],pathex=['C:\\test'],binaries=[],datas=[],
hiddenimports=[],hookspath=[],runtime_hooks=[],excludes=[], win_no_prefer_redirects=False,
win_private_assemblies=False, cipher=block_cipher)

pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, name='tkinter_app', debug=True, strip=False, upx=False,console=True )

我不确定如何在上述 .spec 文件中包含其他 python 文件,以便整个应用程序正常工作。有人可以帮忙吗?

【问题讨论】:

标签: python python-2.7 tkinter pyinstaller


【解决方案1】:

假设您有两个文件:"my_main.py""my_functions.py"。假设 "my_main.py""my_functions.py"

导入方法

执行以下命令:

pyinstaller --onefile my_main.py my_functions.py

生成的单个可执行文件 "my_main.exe" 将在当前工作目录的 "dist" 文件夹下创建。

Linux/Windows 的相同过程。对于两个以上的 python 文件,只需在以空格分隔后包含一个即可。

pyinstaller --onefile my_main.py my_functions.py file3.py file4.py

【讨论】:

    【解决方案2】:

    最好的方法是使用数组datas

    例如这样:

    a = Analysis(['.\\main.py'],
                 pathex=['.'],
                 binaries=None,
                 datas=[ ('.\\Ressources\\i18n', 'i18n'),
                 ('.\\Ressources\\file1.py', '.')],
                 hiddenimports=[],
                 hookspath=[],
                 runtime_hooks=[],
                 excludes=[],
                 win_no_prefer_redirects=False,
                 win_private_assemblies=False,
                 cipher=block_cipher)
    

    注意:确保将其放在正确的相对路径中,以便您的程序能够访问它

    编辑:鉴于您的错误消息,问题不在于使用 PyInstaller 打包,而在于 os.system 命令。

    os.system 相当于打开一个 DOS 命令窗口并输入命令 python_file.py

    要访问你的 python 文件,你必须知道:

    • PyInstaller 将您打包的文件解压到一个临时文件夹中,您可以在 sys._MEIPASS 中访问该文件夹(仅适用于 .exe)
    • os.system 可以用来启动 python 给定文件的完整路径,如下所示: os.system("python " + os.path.join(sys._MEIPASS, "python_file.py"))

      但要小心,这只有在系统上安装了python(并包含在syspath中)和exe安装时才有效。直接执行你的python文件会发送异常。

    【讨论】:

    • 感谢您的回答。通过进行建议的更改,我仍然无法从 GUI 运行支持的 python 文件。我收到类似“file1.py 未被识别为内部或外部命令、可运行程序或批处理文件”之类的错误。 SPEC FILE: a = Analysis(['C:\\Python27\\Scripts\\tkinter_app.py'], pathex=['.'], binaries=None, datas=[('C:\\Python27\\Tools \\i18n','i18n'), ('C:\\Python27\\Scripts\\file1.py','.'), ('C:\\Python27\\Scripts\\file2.py',' .'), ('C:\\Python27\\Scripts\\file3.py','.'), ('C:\\Python27\\Scripts\\file4.py','.'), (' C:\\Python27\\Scripts\\file5.py','.'), .....
    • 当我的电脑中安装了 python 时,这非常有效。我们如何在没有安装 python 的计算机上运行这个应用程序?
    • 将您的 python_file.py 脚本打包成一个函数(例如称为 python_file())并从您的主脚本而不是 os.system 调用它。
    • 使用 pyinstaller 编译时如何包含 python 库(numpy、pandas)。当我使用 os.system 运行支持 python 文件时,这些文件中的库不包含在 exe 文件中
    • hiddenimports=[] 是关键
    【解决方案3】:
    • 未完全验证,可能对您有用。

    • 背景:我在 Win 和 Mac 中使用过多次PyInstaller

    • 回答你的问题:

      • pyinstaller --onefile tkinter_app.py python_file.py
    • 额外说明:如果main.py import some_other.py(和/或其他一些库,例如上面有人提到的numpypandas,等等......,那么PyInstaller可以自动识别它,做不需要添加--onefile等py文件,只需要

      • pyinstaller main.py
    • 如果需要详细解释,请参考official doc

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-14
      • 2015-12-17
      • 1970-01-01
      • 2017-12-25
      相关资源
      最近更新 更多