qkyybqk 2024-03-26 02:22 采纳率: 0%
浏览 5
已结题

python打包后出现逻辑错误bug

写了个脚本如下

from traceback import format_exc
import subprocess
import os
from multiprocessing import Pool
from psutil import cpu_percent
import locale
from time import sleep
import sys


def main():
    print('功能列表:\n1、MP4转GIF')
    choice = input('功能选择:\n')
    try:
        if choice == '1':
            mp4togif()
    except BaseException:
        print(format_exc())
    morework = input('是否继续运行:\n1、是  2、否\n')
    if morework == '1':
        main()
    elif morework == '2':
        input('输入回车可退出程序\n')
        sys.exit()


def mp4togif():
    location = input('请输入MP4文件路径:\n')
    mp4files = []
    for root, dirs, files in os.walk(location):
        for file in files:
            if file.endswith('.mp4'):
                mp4files.append(os.path.join(root, file))

    cpu_cores = os.cpu_count()  # 检查CPU核心数
    pool = Pool(cpu_cores - 1)  # 根据CPU核心数创建进程池
    results = []
    errors = []

    for mp4file in mp4files:
        while True:
            if cpu_percent() < 75:  # CPU占用率超过75%时停发任务,避免卡死
                result = pool.apply_async(func=mp4togif_single, args=(mp4file,), callback=wait)
                results.append(result)
                break
            else:
                sleep(1)
    pool.close()
    pool.join()  # 主进程阻塞,等待子进程全部完成

    for result in results:  # 提取所有报错,进程传参需要格式转换
        error = result.get()
        if error is not None:
            errors.append(error)
    # 设置本地化信息为中国(或者其他适合的本地化信息)
    locale.setlocale(locale.LC_ALL, 'zh_CN.UTF-8')
    # 根据本地化信息排序汉字列表
    errors = sorted(errors, key=locale.strxfrm)

    # 反馈异常情况
    for error in errors:
        print(error)
    return


def mp4togif_single(mp4file):
    print(11)
    fps = 15
    error = None
    try:
        while True:
            ffmpeg_command = [
                'D:\\11190\\Documents\\PycharmProjects\\H\\ffmpeg-6.0-essentials_build\\bin\\ffmpeg.exe',
                '-y',
                '-i', mp4file,
                '-vf',
                f'fps={fps},scale=500:300:force_original_aspect_ratio=decrease,pad=500:300:(ow-iw)/2:(oh-ih)/2,split[s0][s1];[s0]palettegen=stats_mode=diff[p];[s1][p]paletteuse=dither=sierra2_4a',
                '-c:v', 'gif',
                '-pix_fmt', 'pal8',
                '-loop', '0',
                mp4file[0:-3] + 'gif'
            ]
            subprocess.call(ffmpeg_command)
            file_size = os.path.getsize(mp4file[0:-3] + 'gif')
            if file_size > 10485760 and fps > 10:
                fps = fps - 1
                continue
            else:
                break
    except BaseException:
        error = format_exc()
    return error


def wait(result):
    pass


if __name__ == '__main__':
    main()

在pycharm里运行正常,用pyinstaller打包后,再运行exe文件,指定到输入路径那一步后,程序开始逻辑错误,将main放进进程池跑路好几次,如下图所示,试过其他方式打包,bug一样

img

可以帮我看看怎么回事吗

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2024-03-26 04:04
    关注

    【以下回答由 GPT 生成】

    优化建议

    1. 确保打包后程序正确引用了必要的库和资源文件,可以在打包时指定--onefile参数来确保所有文件都被打包进可执行文件中。

    2. 包含所有需要的依赖项并确保正确打包。这可能涉及到使用PyInstaller等打包工具时,需要通过--hidden-import参数明确指定需要的库文件。

    3. 使用日志记录器(logging)可以方便地记录程序运行时的信息,同时方便排查问题。可以按如下方式设置一个简单的日志记录器:

    import logging
    
    # 设置日志级别为DEBUG,将日志记录到文件中
    logging.basicConfig(filename="app.log", level=logging.DEBUG)
    
    1. 在MP4转GIF的过程中添加更多的错误处理机制,可以使用try-except块来捕获异常,避免程序意外退出:
    try:
        # MP4转GIF的代码
    except Exception as e:
        logging.error(f"An error occurred: {str(e)}")
        # 执行错误处理操作,如退出程序或者回滚操作
    

    以上是几点优化建议,您可以尝试按照这些建议进行优化并测试您的程序。如果您有任何更多的问题或者需要更详细的帮助,请随时告诉我!



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月26日
  • 创建了问题 3月26日

悬赏问题

  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振