You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PyInstaller打包的Telegram机器人脚本放入Windows启动文件夹后执行失败求助

解决Telegram机器人打包exe在Windows启动文件夹运行报错的问题

我来帮你分析一下这个问题,你手动运行正常但放到启动文件夹就报错,核心原因主要是工作目录不匹配隐藏控制台导致无法排查错误,结合你的代码细节,具体解决方法如下:

一、核心问题分析

  1. 工作目录权限问题
    手动运行exe时,程序的当前工作目录就是exe所在的文件夹,你拥有完全的读写权限来创建/删除pic.jpg。但Windows从启动文件夹启动程序时,默认工作目录会变成C:\Windows\System32或者你的用户根目录(比如C:\Users\Elliot),在这些目录下创建文件可能会触发权限限制,导致截图保存失败,进而让整个脚本崩溃。

  2. 参数调用不规范
    你的代码里bot.send_photo(message.chat.id, uphoto, today)的写法有问题,send_photo的第三个参数需要明确指定为caption,虽然手动运行时可能兼容,但打包后容易出现参数解析错误。

  3. 隐藏控制台无法排错
    -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

火山引擎 最新活动