百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python一键打包为windows的exe文件,无需安装python环境即可执行

off999 2025-05-14 15:50 23 浏览 0 评论

一、为什么要将Python打包为 exe?

在实际应用中,我们希望Python程序能在没有安装Python环境的电脑上直接运行。将Python代码打包为exe可执行文件,不仅能解决环境依赖问题,还便于程序的分发和部署。

二、常用打包工具及核心函数介绍

1. pyinstaller

pyton程序版本需要Python <3.14, >=3.8。

安装:pip install pyinstaller -i
https://mirrors.aliyun.com/pypi/simple/

打包:pyinstaller [options] script.py

[options]为打包选项,script.py为打包的Python脚本。

  • -F:打包成单个可执行文件(推荐使用,方便文件分发)。
  • -w:窗口化模式,隐藏命令行窗口(适用于图形界面程序)。
  • -i:指定程序图标(格式如.ico)。

案例

# 打包成单个可执行文件
pyinstaller -F hello.py
# 打包图形界面程序,隐藏命令行窗口并指定图标
pyinstaller -F -w -i icon.ico gui_app.py

当然还有其他一些参数,参见附录中的介绍。

2. cx_Freeze

python版本需要Python >=3.9。

安装:pip install cx_Freeze -i
https://mirrors.aliyun.com/pypi/simple/

打包:需要在项目目录下创建setup.py文件进行配置,然后在命令行执行python setup.py build进行打包,最后在build目录下生成可执行exe文件。

from cx_Freeze import setup, Executable
setup(
name="MyApp",
version="1.0",
description="My Python application",
executables=[Executable("main.py")]
)

3. py2exe

py2exe用于Windows平台,适配python版本:Python < 3.12, >=3.8

安装:pip install py2exe -i
https://mirrors.aliyun.com/pypi/simple/

打包:需要在项目目录下创建setup.py文件进行配置,然后在命令行执行python setup.py py2exe进行打包,最后在当前目录下生成可执行exe文件。

from distutils.core import setup
import py2exe
setup(
console=["main.py"]
)

三、实用案例详解

我们将之前文章介绍的使用pywebio做数学题的web程序打包为一个exe可执行文件。(文章:Python中PyWebIO:无须搞懂前端知识,也能5分钟快速搭建Web应用

我们新建一个pywebio-math.py文件,放入程序

from pywebio.pin import put_input, pin, pin_wait_change
from pywebio.output import *
from pywebio.input import *
import random
from pywebio.session import hold


class calcMath:

    def __init__(self, num):
        self.num = num  # 题目的数量
        self.finish_switch = False  # 答案提交后 置为True

    def mathproblem(self):
        """
        根据题目的数量,生成100以内的的加减混合运算的数学题的字典并返回;
        字典的key是题目,value是答案
        """
        math_problem = {}
        num = 1
        while num <= self.num:
            num1 = random.randint(1, 99)
            num2 = random.randint(1, 99)
            num3 = random.randint(1, 99)
            if num1 + num2 - num3 < 100 and num1 + num2 - num3 > 0 and num1 + num2 < 100:
                num += 1
                result = num1 + num2 - num3
                key_name = f'{num1} + {num2} - {num3}'
                math_problem[key_name] = result
        return math_problem

    def submit_result(self):
        # 弹出对话框  是否确认提交  点击提交会触发生成答案信息
        popup('确定提交吗?', [
            put_buttons(['确定'], onclick=lambda _: self.set_witch()),
            put_buttons(['取消'], onclick=lambda _: close_popup())
        ])

    def set_witch(self):
        self.finish_switch = True
        try:
            close_popup()
        except Exception as e:
            print(e)

        if self.finish_switch:
            # 生成答案信息 并输出
            self.analyse_result(inputs_str, origin_answer_result, new_answer_result)
            self.finish_switch = False

    def analyse_result(self, inputs_str, origin_answer_result, new_answer_result):

        """
        分析答案
        :param inputs_str: 包含题目信息的列表
        :param origin_answer_result:  真实答案
        :param new_answer_result:     答题的答案
        : return:
        """

        rightnum = 0  # 做对的题目数
        for num in range(len(inputs_str)):
            # 判断输入为空或者不为数字时,认为题目做错了
            if not new_answer_result[num] or not str(new_answer_result[num]).isdigit():
                put_text(
                    f'这个题 {inputs_str[num]} 做错了, 提交的答案是{new_answer_result[num]} ,正确答案是{origin_answer_result[num]}')
            else:
                # 当真实答案和做出的答案一致时,数字加1
                if int(origin_answer_result[num]) == int(new_answer_result[num]):
                    rightnum += 1
                else:
                    put_text(
                        f'这个题 {inputs_str[num]} 做错了, 提交的答案是{new_answer_result[num]} ,正确答案是{origin_answer_result[num]}')
        # 汇总最后的结果输出到web页面上
        put_text(f'--总共{len(inputs_str)},做对了{rightnum}题,做错了{len(inputs_str) - rightnum}题')

    def start_do_math(self):
        """
        执行函数
        :return:
        """
        # 生成数学题字典 key是题目,value是答案
        mathdict = self.mathproblem()

        # 生成pywebio的input函数用到的输入数学题信息列表: 展示的是题目信息
        inputs_str = [f'{key} = ( )' for key in mathdict.keys()]

        # 生成对应的答案列表 用于跟答题时写的答案做对比
        origin_answer_result = [mathdict[key] for key in mathdict.keys()]

        # 调用pywebio的pin.put_input函数 和pin_wait_change 监听输入的答案 输入后进行下一个题目
        keys = [f'num{i + 1}' for i in range(self.num)]
        for i in range(self.num):
            put_input(keys[i], label=f'第{i + 1}题 请在下方输入答案(输入后不支持修改)\n {inputs_str[i]}')
            pin_wait_change(keys[i], timeout=1000)  # 监听输入 有输入后才进行下一次循环

        # 提交按钮  点击后弹出确认对话框
        put_button('submit', onclick=self.submit_result)
        # 提取提交的答案
        new_answer_result = [getattr(pin, key) for key in keys]
        # print(new_answer_result)
        return inputs_str, origin_answer_result, new_answer_result


num = input('请输入题目的数量:',type=NUMBER)
math1 = calcMath(num)  #实例化
inputs_str, origin_answer_result, new_answer_result = math1.start_do_math()
#保持会话 直到关闭浏览器
hold()

然后我们使用上述介绍的方法,打包为一个exe文件,打包后我们双击exe文件,执行效果跟通过python执行是一样的。

我们使用cx_Freeze进行打包,在程序目录中见一个setup.py文件,然后填入参数

from cx_Freeze import setup, Executable
setup(
    name="MyApp",
    version="1.0",
    description="My Python application",
    executables=[Executable("pywebio-math.py")]
)

目录内容如下:


然后再命令行执行:

最后在build目录生成一个exe文件

我们双击pywebio-math.exe然后执行。

四、附录

pyinstaller的其他一些参数介绍:

1. -p, --paths 添加额外的模块搜索路径。当你的程序依赖的模块不在默认搜索路径中时,可通过该参数指定路径,PyInstaller找到相关模块。

pyinstaller -F -p ./my_lib script.py

PyInstaller在打包时就会到./my_lib路径下查找所需模块。

2. --add-data 将非 Python 文件(如图片、配置文件等)添加到打包结果中。在 Windows 系统中,参数格式source;dest;在 Linux 和 macOS 系统中,参数格式source:dest。其source是源文件或目录路径,dest是打包后文件在可执行文件中的存放路径。

若你的程序使用icon.png图片,且该图片在./images目录下,希望打包后图片存放在./assets目录下,在 Linux 或 macOS 系统中可使用以下命令:

pyinstaller -F --add-data "images/icon.png:assets" script.py

在 Windows 系统中则为:

pyinstaller -F --add-data "images/icon.png;assets" script.py

3. --exclude-data-dir 从打包结果中排除指定的数据目录,可用于减少打包文件体积,排除不必要的数据。

如果你的项目中./temp_data目录下的数据在程序运行时不需要,可使用该参数排除:

pyinstaller -F --exclude-data-dir temp_data script.py

4. -D, --onedir 将程序打包成一个目录,目录中包含可执行文件和所有依赖文件。相比-F生成单个可执行文件,这种模式便于调试和查看文件结构。

pyinstaller -D script.py

打包完成后,dist目录下会生成一个以脚本名称命名的文件夹,里面存放着可执行文件和相关依赖。

5. --clean 在打包前清理掉之前打包过程中产生的临时文件和缓存,避免旧的打包残留影响本次打包,确保打包的纯净性。

pyinstaller --clean -F script.py

6. --upx-dir 指定UPX压缩工具的路径。UPX 是一款高效的可执行文件压缩器,使用--upx-dir参数并配合--upx-exclude等参数,可以压缩打包后的可执行文件,减小文件体积。

pyinstaller --upx-dir /usr/local/upx -F your_script.py

7. --debug 启用调试模式,可分为--debug=imports、--debug=bootloader等不同级别。--debug=imports会在打包过程中输出详细的模块导入信息,有助于排查模块导入相关问题;--debug=bootloader则输出引导加载器相关的调试信息。

pyinstaller --debug=imports -F script.py

相关推荐

固态硬盘如何安装(固态硬盘如何安装系统)

1、首先要在在机箱内找到固态硬盘安装的电源连接线,是从电脑的电源引出的一根线。形状是扁嘴形上面一般印着一个白色的“P4”2、然后要在主板上找固态硬盘的数据接口,用于数据输入输出,俗称SATA接口,再找...

windows怎么打开注册表(windows怎么打开注册表管理器)

方法一、直接打开注册表1、点击屏幕左下角的“开始”按钮,再点击“运行”;2、或者直接按Win键+R键,打开“运行”对话框;3、在“运行”输入框中输入“regedit”命令;4、这样就能够打开注册表编辑...

windows7安装windows10(windows7安装光盘下载)

在安装Win7时,出现提示“Windows无法安装到这个磁盘。这台计算机的硬件可能不支持启动到此磁盘。请确保在计算机的bios菜单中启用了磁盘的控制器。” 解决方法: 1.如果之前你做过BIOS设置,...

装机配置模拟器(装机配置模拟器教程)
装机配置模拟器(装机配置模拟器教程)

装机模拟器2好装机模拟器2装系统方法1.在游戏PC装机模拟器里,有时候我们修理好电脑之后,发现电脑没有安装操作系统,这时候应该先安装系统。2.第一步,点击PC装机模拟器游戏,登录游戏。3.第二步,进入游戏之后,找到需要没有安装操作系统的电脑...

2025-11-10 21:51 off999

电脑网络正常但是上不了网(网络正常但电脑无法上网)

分析如下1、首先检查网卡的问题,打开电脑后,打开电脑右下角的WiFi连接,然后从里面的网络和共享中心检查,打开网络和共享中心后,出现对话框,在对话框左侧上方找到更改适配器设置,单击左键打开,就可以发现...

vs2008安装包下载(vs2008下载官方下载)

vs2008是面向WindowsVista、Office2007、Web2.0的下一代开发工具,VS2008引入了250多个新特性,整合了对象、关系型数据、XML的访问方式,语言更加简洁。使用V...

怎么换系统win7(怎么换系统盘固态硬盘)
  • 怎么换系统win7(怎么换系统盘固态硬盘)
  • 怎么换系统win7(怎么换系统盘固态硬盘)
  • 怎么换系统win7(怎么换系统盘固态硬盘)
  • 怎么换系统win7(怎么换系统盘固态硬盘)
cad2018序列号(cad2018序列码)

AutoCAD2018序列号和密钥:序列号:356-72378422,666-69696969,667-98989898,400-45454545,066-66666666等密钥:001J1CA...

恢复出厂设置win7(恢复出厂设置win11)
  • 恢复出厂设置win7(恢复出厂设置win11)
  • 恢复出厂设置win7(恢复出厂设置win11)
  • 恢复出厂设置win7(恢复出厂设置win11)
  • 恢复出厂设置win7(恢复出厂设置win11)
ip检测网站(ip地址测试)

IP检测工具(IPNetChecker)V1.5.2是一个简易实用,功能强大的网络监控软件,使您可以检查互联网和局域网上的IP主机的网络状态。IP检测工具(IPNetChecker)V1.5....

云电脑app哪个好(手机云电脑app哪个最好)

答:以下是一些比较好的云电脑应用程序推荐:1.AnyDesk-支持Windows、MacOS、Linux、Android和iOS,可用于远程访问和控制PC或移动设备。2.Splashtop...

怎样注册邮箱163免费(怎样注册邮箱163免费账号)

一、工具:电脑(联网)、浏览器二、操作步骤:【1】打开浏览器,找到“163邮箱”,点击。【2】点击右边的“注册”。【3】网站默认注册手机号码邮箱,填写信息,点击“注册”。若不想泄漏手机号码或不想使用手...

微软surface pro 6(微软surface pro 6可以扩容吗)

SurfacePro6的接口包含:1个标准尺寸USB3.0端口,3.5mm耳机插孔,MiniDisplayPort,1个SurfaceConnect端口,Surface专业键盘盖端口,microSDX...

电源已接通未充电怎么回事(电源已接通未充电 真正解决办法)

原因分析:出现这样的原因有可能是长时间没有充电,导致电池的内部电量耗完后亏电严重,只是电脑充电的保护,不让过充而已,只要设置一下电池选项一般就可以解决问题了。解决方法:1、关机,拔下电源,拔出电池,...

华为云会议app下载(华为云会议下载)

 华为云会议可以在PC客户端或者手机客户端上一键发起立即会议,1秒创会。然后在会中选择企业通讯录中的人加入,系统会自动呼叫这些与会人,接听后即加入会议。ZOOM是一个云会议服务平台,为客户提...

取消回复欢迎 发表评论: