py脚本生成exe时的路径问题

使用auto-py-to-exe打包

  • 打开cmd,使用pip install auto-py-to-exe;
  • 安装完成之后,在cmd中使用auto-py-to-exe直接打开该工具:

py文件路径导致的问题

  • 因为在写py文件时,获取路径直接使用的是current_dir=so.sys.path[0],在打包成exe之后,路径其实变成了一个虚拟路径,这样就会造成执行文件时找不到路径下对应的文件。
  • 解决办法:将 os.sys.path[0] 替换为 os.path.dirname(sys.executable),这样在打包成 .exe 后会正确获取 .exe 文件所在的目录。

案例

# -*- coding: utf-8 -*-
import os
import sys
import win32com
import win32com.client

ppSaveAsJPG = 17

def ppt_to_jpg(ppt_file_name, output_dir_name):
    '''将PPT另存为JPG格式
    arguments:
        ppt_file_name: 要转换的ppt文件,
        output_dir_name:转换后的存放JPG文件的目录
    '''
    # 启动PPT
    ppt_app = win32com.client.Dispatch('PowerPoint.Application')
    # 设置为0表示后台运行,不显示,1则显示
    ppt_app.Visible = 1
    # 打开PPT文件
    ppt = ppt_app.Presentations.Open(ppt_file_name)
    # 另存为
    ppt.SaveAs(output_dir_name, ppSaveAsJPG)
    # 退出
    ppt_app.Quit()

if __name__ == '__main__':
    #current_dir = os.sys.path[0]
    # 获取当前目录,适配打包后的路径
    current_dir = os.path.dirname(sys.executable) if getattr(sys, 'frozen', False) else os.path.dirname(__file__)
    dir_list = os.listdir(current_dir)
    # 当前目录下所有的PPT文件,eg: ppt_name.ppt
    ppt_file_names = (fns for fns in dir_list if fns.endswith(('.ppt', '.pptx')))
    # 当前目录下所有的PPT文件名,这两者的区别在于有无后缀名,eg: ppt_name
    ppt_names = (os.path.splitext(fns)[0] for fns in dir_list if fns.endswith(('.ppt', '.pptx')))
    for ppt_file_name, ppt_name in zip(ppt_file_names, ppt_names):
        # 该PPT的完整路径文件名,eg: F:\\test\\ppt_name.ppt
        ppt_file_name = os.path.join(current_dir, ppt_file_name)
        # 需要新建一个与PPT同名的文件,获取完整路径,eg:  F:\\test\\ppt_name
        ppt_dir_path = os.path.join(current_dir, ppt_name)
        os.mkdir(ppt_dir_path)
        # print ppt_file_name, ppt_dir_path
        ppt_to_jpg(ppt_file_name, ppt_dir_path)

# getattr(sys, 'frozen', False):用于判断代码是否被打包成 .exe。
# os.path.dirname(sys.executable):获取 .exe 文件所在的目录。
# os.path.dirname(__file__):在未打包时,获取脚本文件所在的目录。
# 这样修改后,无论是直接运行脚本还是打包成 .exe,都能正确处理路径问题。
posted @ 2025-04-12 15:06  你要去码头整点薯条吗  阅读(115)  评论(0)    收藏  举报