从代码到应用:打包你的Python为可执行的exe或app

前言:

很多时候我们用python编写了一些程序或者工具之后,可能需要在其他电脑上运行它,或者与不会编程的人分享。这时候我们就需要用到可以把python打包成可执行文件的工具,例如:Pyinstaller、Py2app、cx_Freeze等。在这里,我将分享一些我们在使用这些工具进行打包过程中遇到的一些问题和解决方法。

1、 Pyinstaller

1.1 Pyinstaller简介

PyInstaller将Python应用程序及其所有依赖项打包成一个单独的包。用户可以在不安装Python解释器或任何模块的情况下运行打包的应用程序。PyInstaller支持Python 3.7及更新版本,并正确打包了许多主要的Python包,如numpy、matplotlib、PyQt、wxPython等。
PyInstaller已在Windows、MacOS X和Linux上进行了测试。然而,它不是一个交叉编译器;如果要制作Windows应用程序,则在Windows上运行PyInstaller;如果要制作Linux应用程序,则在Linux上运行PyInstaller,依此类推。
详细信息可以见官方说明

1.2 安装Pyinstaller

如果安装了pip可以使用如下命令安装Pyinstaler

pip install -U pyinstaller
1.3 检查Pyinstaller的版本:

可以执行命令pyinstaller -v 检查安装的版本,有输出对应的版本号即为安装成功:
在这里插入图片描述

1.4 打包python程序:

可以使用如下命令打包python文件:

pyinstaller -F -w myapp.py
1.5 常用的Pyinstaller参数说明

常用的参数说明如下:

  1. -F:将应用程序打包成单个可执行文件,方便传输和分发。
  2. -D:将应用程序打包成一个目录,包括可执行文件和所有依赖项,这种方式更适合于开发和调试阶段。
  3. -c:将打包的应用程序控制台输出写入控制台,而不是将其重定向到文件中。
  4. -w:生成没有控制台窗口的GUI应用程序,适用于不需要在命令行上运行的应用程序。
  5. -n:指定生成的可执行文件的名称。
  6. –icon:指定应用程序的图标文件。
  7. –upx-dir:指定UPX可执行文件压缩器的位置,用于进一步压缩生成的可执行文件。
  8. –clean:清除之前生成的打包文件和临时文件,以确保干净的构建环境。
  9. –debug:生成带有调试信息的应用程序,以便进行调试和故障排除。
  10. -v:输出更详细的日志信息,用于调试和故障排除。

更多详细参数可以在终端执行pyinstaller -h 查看:
在这里插入图片描述

1.6 踩坑之路,存在多个版本的python

打包的过程很顺利,但是发现执行不起来,于是把打包参数中的参数-w去掉了,直接用pyintaleer -F myapp.py 打包,然后查看执行的过程:
在这里插入图片描述
可以看到报错是NO module named 'mutagen',但是直接执行python文件是正常的。
于是重新进行打包,仔细看了打包的过程发现了问题,打包过程中使用的pyinstaller和python的版本都不对。原来是因为我的电脑安装了两个不同版本的python,旧版本的python也安装了Pyinstaller,执行的过程中用了旧的Pyinstaller进行了打包,但是由于那个环境没有安装mutagen库,导致打包的时候失败了。
解决方案: 直接切换到旧版本的python把Pyinstaller卸载了,再在新的python重新安装了Pyinstaller,重新打包执行成功。
所以如果存在多版本的环境,一定要检查清楚当前使用的版本!!!

2、 py2app

2.1 py2app简介

py2app 是一个 Python setuptools 命令,它允许您从 Python 脚本制作独立的 Mac OS X 应用程序包和插件。

py2app 在目的和设计上与 Windows 的 py2exe 相似。

注意:py2app 必须在 macOS 上使用才能构建应用程序,它不能在其他平台上创建 Mac 应用程序。详细信息见官方

2.2 安装py2app

可以使用如下命令安装py2app:

pip install py2app
2.3 打包python程序
2.3.1 创建一个 setup.py 文件

第一步是为您的脚本创建一个setup.py文件。setup.py 是“项目文件”,它告诉setuptools构建应用程序所需的一切信息。我们将使用py2applet命令来做到这一点:

py2applet --make-setup MyApp.py
2.3.2 编辑setup.py文件

可以执行vi setup.py编辑setup.py文件配置icon文件、需要打包的文件、需要打包的模块等,如下是一个示例:

from setuptools import setup

APP = ['main.py']   # 需要打包的Python程序
DATA_FILES = []     # 需要打包的其他文件,如图片、配置文件等
OPTIONS = {         # 打包选项
    'iconfile': 'icon.icns',          # 应用程序图标
    'plist': {'CFBundleShortVersionString': '0.1.0'},   # 应用程序版本号
    'packages': ['wx', 'numpy'],     # 需要打包的Python模块
    'includes': ['sip', 'PyQt4'],    # 需要包含的其他模块
}

setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

以上参数说明如下:

  • APP:需要打包的Python程序,可以是单个文件或多个文件组成的列表。

  • DATA_FILES:需要打包的其他文件,如图片、配置文件等,可以是单个文件或多个文件组成的列表。

  • OPTIONS:打包选项,是一个字典,用来配置应用程序的图标、版本号、需要打包的Python模块、需要包含的其他模块等。

  • iconfile:应用程序图标文件的路径,可以是.icns、.iconset或.png格式的文件。

  • plist:应用程序的属性列表,包含了应用程序的基本信息,如名称、版本号等。

  • packages:需要打包的Python模块,可以是单个模块或多个模块组成的列表。

  • includes:需要包含的其他模块,可以是单个模块或多个模块组成的列表。

  • setup():用来描述打包的过程,其中包含了以下参数:

  • app:需要打包的Python程序,与APP参数相同。

  • data_files:需要打包的其他文件,与DATA_FILES参数相同。

  • options:打包选项,是一个字典,用来配置应用程序的各种属性,与OPTIONS参数相同。

  • setup_requires:用来指定需要安装的Python模块,即py2app模块。

更多详细的参数说明,可以参考py2app官方文档。

2.3.3 构建.app文件

可以执行如下命令使用py2app生成.app文件:

 python setup.py py2app

执行成功后就可以在当前路径下的dist文件夹找到对应的.app文件了。

2.5 注意事项

打包的.app文件默认在app下的 Contents/Resources/ 路径下执行程序,如果需要生成日志文件、读取当前路径下的文件需要注意文件路径的配置。

3、 cx_Freeze

3.1 cx_Freeze简介

cx_Freeze从 Python 脚本创建独立的可执行文件,具有相同的性能,是跨平台的,理论上可以在Python 本身可以运行的任何平台上运行。cx_Freeze的当前版本是 6.14,它支持 Python 3.7 到 3.11。详细说明见官方文档

3.2 安装cx_Freeze

可以执行如下命令安装cx_Freeze

pip install  cx_Freeze
3.3 使用cx_Freeze打包python
3.3.1 创建setup.py

创建一个setup.py文件,文件内容大致如下:

import sys
from cx_Freeze import setup, Executable

# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {
    "excludes": ["tkinter", "unittest"],
    "zip_include_packages": ["encodings", "PySide6"],
}

# base="Win32GUI" should be used only for Windows GUI app
base = "Win32GUI" if sys.platform == "win32" else None

setup(
    name="guifoo",
    version="0.1",
    description="My GUI application!",
    options={"build_exe": build_exe_options},
    executables=[Executable("guifoo.py", base=base)],
)

上述setup.py文件中的各个参数说明如下:

  • name:程序的名称。

  • version:程序的版本号。

  • author:程序的作者。

  • description:程序的描述信息。

  • options:打包选项,其中build_exe选项指定了构建exe程序所需的相关信息。

    • includes:需要包含的模块列表。
    • include_files:需要打包的其他文件和数据。
    • packages:需要打包的Python包列表。
    • excludes:需要排除的模块列表。
  • executables:包含所有要构建的exe程序的列表。每个exe程序都需要指定以下信息:

    • script:要打包的Python脚本。
    • base:构建exe程序的基础平台。在本例中,我们将base设置为None,这意味着在MAC环境下使用默认的GUI界面;如果要在Windows环境下使用GUI界面,则需要将base设置为"Win32GUI"
    • icon:exe程序的图标文件路径。在本例中,我们将其设置为None,这意味着不使用图标文件。
3.3.2 打包程序文件

可以执行如下命令打包生成可执行文件,windows和MAC的有细微区别:

python setup.py bdist_msi # 打包windows的exe包
python setup.py bdist_mac # 打包MAC的app包
  • 10
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要将Python脚本打包执行应用程序,你可以使用PyInstaller或cx_Freeze等工具。这些工具可以将Python代码和依赖项打包一个独立的可执行文件。在下面的例子中,我们将使用PyInstaller来演示。 首先,确保你已经安装了PyInstaller: ``` pip install pyinstaller ``` 然后,创建一个Python脚本,比如`app.py`,来实现自定义时间关闭指定服务并复制指定文件到指定磁盘的功能: ```python import subprocess import shutil import time def stop_service(service_name): # 停止指定的服务 subprocess.run(['sudo', 'service', service_name, 'stop']) def copy_file(source_file, destination_disk): # 复制指定文件到指定磁盘 shutil.copy(source_file, destination_disk) # 示例用法 service_name = 'apache2' source_file = '/path/to/source/file.txt' destination_disk = '/path/to/destination/disk/' stop_service(service_name) copy_file(source_file, destination_disk) time.sleep(60) # 自定义时间,单位为秒 # 继续其他操作... ``` 接下来,使用PyInstaller将该脚本打包执行文件: ``` pyinstaller app.py --onefile ``` 这将生一个名为`app.exe`的可执行文件。 最后,你可以将该可执行文件拷贝到其他机器上,并在需要的时间运行它来关闭指定服务并复制文件到指定磁盘。 请注意,这个例子假设你的操作系统是基于Linux的,因此使用了`sudo`命令来停止服务。如果你的操作系统是Windows,请根据具体情况修改相关命令。另外,你可能还需要在打包过程中处理依赖项,以确保生的可执行文件可以在目标机器上正确运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MR. Ben AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值