【Pyinstaller】Python 项目打包为可输入参数的exe可执行文件(保姆篇)

在这里插入图片描述


更多相关内容可查看

PyInstaller 介绍

PyInstaller 是一个用于将 Python 程序打包成独立可执行文件(executable)的工具。它能够将 Python 脚本和依赖的库、资源文件等打包成一个单独的可执行文件,适用于 Windows、macOS 和 Linux 等操作系统。

主要特点和优势:

  1. 跨平台支持: PyInstaller 支持在多个操作系统上打包和生成可执行文件,包括 Windows、macOS 和各种 Linux 发行版。

  2. 单文件打包: 它可以将一个 Python 脚本及其所有依赖的库和资源文件打包成一个独立的可执行文件,用户不需要安装 Python 解释器或额外的依赖就可以运行程序。

  3. 自动化打包: PyInstaller 能够自动分析 Python 程序的依赖关系,并将所有需要的文件打包进最终的可执行文件中,这包括 Python 标准库、第三方库和其他资源文件。

  4. 支持多种打包选项: 可以生成单个的可执行文件(Windows 上为 .exe,macOS 上为 .app,Linux 上为可执行文件),也可以生成文件夹分发,甚至是支持 Windows 下的服务程序和控制台程序。

  5. 丰富的配置选项: PyInstaller 提供了丰富的配置选项,可以帮助开发者控制打包过程中的细节,比如输出文件的名字、图标文件的设置、打包过程中的路径搜索等。

  6. 社区活跃: PyInstaller 是一个开源项目,拥有活跃的社区支持和更新,能够及时响应和修复问题,保持与 Python 最新版本的兼容性。

PyInstaller 是一个功能强大且广泛使用的工具,可以帮助 Python 开发者将他们的程序轻松打包成独立的可执行文件,便于分发和部署。无论是用于发布桌面应用程序、命令行工具还是其他需要独立运行环境的场景,PyInstaller 都是一个非常有价值的工具选择。


PyInstaller 下载使用

·将 Python 项目打包成可接受参数的可执行文件(.exe)通常可以通过以下步骤完成,使用工具如 PyInstaller 或 cx_Freeze。这里以 PyInstaller 为例,它是一个常用的打包工具,支持将 Python 项目打包成独立的可执行文件。

使用 PyInstaller 打包项目

  1. 安装 PyInstaller

    如果还没有安装 PyInstaller,可以使用 pip 进行安装:

    pip install pyinstaller
    
  2. 创建打包脚本

    创建一个打包脚本(如 call.py),用来指定打包的配置和参数。这是可选的,但可以帮助你在打包时指定一些特定的配置选项。(80%源码,剩余20%可私信作者)

   #特殊脚本可私信作者
   def is_eleven_digit_number(element):
    return element.isdigit() and len(element) == 11
	def is_time_format(element):
	    pattern = r'^\d{2}:\d{2}$'
	    return bool(re.match(pattern, element))
	def execute_tasks(phon_num):
	    threads = [
	        threading.Thread(target=send_paipai, args=(phon_num,)),
	        threading.Thread(target=func3, args=(phon_num,)),
	        threading.Thread(target=send_chuanhang, args=(phon_num,)),
	        threading.Thread(target=send_wushang, args=(phon_num,)),
	        threading.Thread(target=send_caiyun, args=(phon_num,)),
	        threading.Thread(target=send_phpzw, args=(phon_num,)),
	        threading.Thread(target=func9, args=(phon_num,)),
	        threading.Thread(target=func1, args=(phon_num,)),
	        threading.Thread(target=func21, args=(phon_num,)),
	        threading.Thread(target=send_spump, args=(phon_num,)),
	        threading.Thread(target=func24, args=(phon_num,)),
	        threading.Thread(target=func19, args=(phon_num,)),
	        threading.Thread(target=func10, args=(phon_num,))
	    ]
	
	    for t in threads:
	            t.start()
	
	    for t in threads:
	            t.join()
	
	def register_hourly_tasks(phon_num,start_time,end_time,printtime,interval):
	    while True:
	        current_time = datetime.datetime.now().strftime("%H:%M")
	        if start_time <= current_time <= end_time:
	            # 如果当前时间在定时任务时间范围内,注册任务
	            while current_time <= end_time:
	                schedule.every().day.at(current_time).do(lambda:execute_tasks(phon_num))
	                print(f"已注册定时任务执行时间:{current_time}")
	                current_time = (datetime.datetime.strptime(current_time, "%H:%M") + datetime.timedelta(
	                    minutes=interval)).strftime("%H:%M")
	            else:
	                break
	        else:
	            # 如果当前时间不在定时任务时间范围内,计算距离下一个任务开始的时间
	            if current_time < start_time:
	                next_time = start_time
	            else:
	                next_time = (datetime.datetime.strptime(current_time, "%H:%M") + datetime.timedelta(
	                    minutes=interval)).strftime("%H:%M")
	
	            next_start = datetime.datetime.strptime(next_time, "%H:%M")
	            current_datetime = datetime.datetime.now()
	            delta = next_start - current_datetime
	
	            hours = delta.seconds // 3600
	            minutes = (delta.seconds // 60) % 60
	            seconds = delta.seconds % 60
	
	            print(f"当前时间为 {current_datetime.strftime('%H:%M')}, 距离定时任务开始还剩 {hours} 小时 {minutes} 分钟 {seconds} 秒")
	            time.sleep(printtime)
	def shutdown_computer():
	    subprocess.run(["shutdown", "/s", "/t", "1"])
	def is_boolean(var):
	    return isinstance(var, bool)
	def checkdata(phon_num,start_time,end_time,shutdown_flag):
	    if not is_eleven_digit_number(phon_num):
	        print(f'{phon_num} :不是一个正确的手机号码,请修改!')
	        sys.exit(1)
	    if not is_time_format(start_time):
	        print(f'{start_time} :不符合时间格式 "HH:MM",请修改!')
	        sys.exit(1)
	    if not is_time_format(end_time):
	        print(f'{end_time} :不符合时间格式 "HH:MM",请修改!')
	        sys.exit(1)
	    if not is_boolean(shutdown_flag):
	        print(f'{shutdown_flag} :不符合布尔类型True/False,请修改!')
	        sys.exit(1)
	def start():
	    phon_num = input("请输入手机号:")
	    start_time = input("请输入定时任务开始时间(例如20:00):")
	    end_time = input("请输入定时任务结束时间(例如21:00):")
	    interval = int(input("请输入定时任务间隔时间(分钟):"))
	    printtime = int(input("请输入控制台打印间隔时间(秒):"))
	    shutdown_flag = bool(input("执行完是否自动关机(例如:True):"))
	    #数据校验
	    checkdata(phon_num,start_time,end_time,shutdown_flag)
	    #定时任务注册
	    register_hourly_tasks(phon_num,start_time,end_time,printtime,interval)
	    #定时任务执行
	    while  datetime.datetime.now().strftime("%H:%M") <= end_time:
	        schedule.run_pending()
	        time.sleep(30)
	    #清空定时任务
	    schedule.clear()
	    #关机
	    if shutdown_flag:
	        shutdown_computer()
	
	    print("已发送完成")
	
	if __name__ == "__main__":
	    start()

控制台打印如下

在这里插入图片描述

  1. 使用 PyInstaller 打包

    在命令行中使用 PyInstaller 将 Python 项目打包成可执行文件。假设你的 Python 脚本接受命令行参数,例如 call.py

   pyinstaller --onefile --console call.py
  • --onefile:生成单个独立的可执行文件,而不是生成多个文件。
  • --console:指定生成的可执行文件为控制台应用程序,这样可以在命令行中传递参数。
  1. 运行生成的可执行文件

    完成打包后,PyInstaller 将在 dist 文件夹中生成一个可执行文件。你可以在命令行中运行这个可执行文件,并传递参数(也可以使用input输入):

    ./dist/call.exe arg1 arg2
    

    这里的 arg1arg2 是你希望传递给 call.py 的命令行参数。

成功示例:

在这里插入图片描述

注意事项

  • 参数传递方式:Python 脚本中接收命令行参数通常通过 sys.argv,确保在打包时设置了正确的命令行参数。
  • 操作系统兼容性:PyInstaller 支持在 Windows、macOS 和 Linux 上生成对应平台的可执行文件,确保在相应的操作系统上测试和使用。
  • 依赖管理:确保在打包前,所有项目的依赖都已经安装,并且能够正确导入和使用。

偶尔可能会闪退,目前暂未解决,多打开几次既可以了

通过以上步骤,你可以将你的 Python 项目成功打包成可以接受命令行参数的独立可执行文件。


常用参数详解

  • -F, --onefile: 将生成的可执行文件打包成一个单独的 .exe 文件。这对于分发单个文件的应用程序很有用。

    pyinstaller -F yourscript.py
    
  • -D, --onedir: 默认模式,将生成多个文件,包括一个目录,其中包含所有的依赖项。

    pyinstaller -D yourscript.py
    
  • -w, --noconsole: 隐藏控制台窗口(仅限 Windows 平台)。适用于 GUI 应用程序。

    pyinstaller -w yourscript.py
    
  • --name: 指定生成的可执行文件的名称。

    pyinstaller --name=myapp yourscript.py
    
  • -p, --paths: 指定额外的模块搜索路径。

    pyinstaller -p /path/to/extra/module yourscript.py
    
  • --hidden-import: 显式导入隐藏的依赖项,以确保 PyInstaller 能够找到并打包这些依赖项。

    pyinstaller --hidden-import=module_name yourscript.py
    
  • --icon: 指定应用程序的图标文件。

    pyinstaller --icon=app.ico yourscript.py
    
  • --add-data: 添加非 Python 文件到可执行文件中,如数据文件或配置文件。

    pyinstaller --add-data 'datafile.txt:.' yourscript.py
    
  • --noconfirm: 在打包过程中不进行用户交互确认。

    pyinstaller --noconfirm yourscript.py
    

其他参数

  • --clean: 清理临时文件和缓存。

    pyinstaller --clean yourscript.py
    
  • --specpath: 指定生成 .spec 文件的路径。

    pyinstaller --specpath /path/to/specs yourscript.py
    
  • --debug: 打印调试信息。

    pyinstaller --debug yourscript.py
    

注意事项

  • PyInstaller 默认会生成一个 dist 目录,在这个目录中你可以找到生成的可执行文件和其他打包所需的文件。

  • 需要特别注意的是,有些第三方库可能需要特定的配置或者额外的处理才能正确打包。在使用 PyInstaller 打包应用程序时,建议先在简单的项目中测试,以确保所有依赖项都能正确打包进可执行文件中。

这些参数提供了灵活的选项,帮助你根据实际需求定制和优化打包过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

来一杯龙舌兰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值