pyinstaller 打包之后,运行无法生成log文件,是为什么?

发布于 2022-09-06 00:26:07 字数 2980 浏览 20 评论 0

在没有打包成EXE文件之前是可以正常生成log文件的,用pyinstaller打包之后,再点击运行exe文件,却无法生成log文件夹了。exe运行正常,就是程序报错时无法把错误信息打印到log文件中。
图片描述
pyinstaller打包之后生成的warn*.txt

这是程序调用的log模块

import os
import time
import logging
import traceback

logging.basicConfig(level=logging.INFO)


class LOG(object):
    def __init__(self, logger):
        self.fileHandlerName = ''
        self.fileHandler = None
        self.loggerName = logger
        self.logger = logging.getLogger(logger)
        self.logger.setLevel(logging.DEBUG)
        self.formatter = logging.Formatter("=========ntime:%(asctime)s nlogger:%(name)s nlevel:%(levelname)s "
                                           "nfile:%(filename)s nfun:%(funcName)s nlineno:%(lineno)d "
                                           "\n nmessage:%(message)s")
        # 控制台
        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)
        ch.setFormatter(self.formatter)
        self.logger.addHandler(ch)
        path = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'log', self.loggerName)
        print('log path=', path)

    def setfh(self):
        fname = time.strftime("%Y%m%d%H%M")
        if fname != self.fileHandlerName:
            # 移除原来的句柄
            if self.fileHandler is not None:
                self.logger.removeHandler(self.fileHandler)
            # 设置日志文件保存位置
            path = os.path.join(os.path.abspath(os.path.dirname(__file__)) , 'log',self.loggerName)
            print(path)
            if not os.path.isdir(path):
                os.makedirs(path)
            fh = logging.FileHandler(path + fname + '.log')

            fh.setLevel(logging.DEBUG)
            fh.setFormatter(self.formatter)
            self.logger.addHandler(fh)
            self.fileHandlerName = fname
            self.fileHandler = fh

    # 格式化日志内容
    def _fmtInfo(self, msg):
        if len(msg) == 0:
            msg = traceback.format_exc()
            return msg
        else:
            _tmp = [msg[0], traceback.format_exc()]
            return '\n**********\n'.join(_tmp)

    # 封装方法
    def debug(self, *msg):
        _info = self._fmtInfo(msg)
        try:
            self.setfh()
            self.logger.debug(_info)
        except:
            print('mylog debug:' + _info)

    def error(self, *msg):
        _info = self._fmtInfo(msg)
        try:
            self.setfh()
            self.logger.error(_info)
        except:
            print('mylog error:' + _info)

    def info(self, *msg):
        _info = self._fmtInfo(msg)
        try:
            self.setfh()
            self.logger.error(_info)
        except:
            print('mylog info:' + _info)

    def warning(self, *msg):
        _info = self._fmtInfo(msg)
        try:
            self.setfh()
            self.logger.error(_info)
        except:
            print('mylog warning:' + _info)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

剩一世无双 2022-09-13 00:26:07

其实有生成log文件,但是不是在exe文件所在的文件夹内。
path = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'log', self.loggerName)
问题在这一句代码。
os.path.dirname(__file__)返回的是当前脚本的所在路径,使用pycharm和直接点击运行py文件,这个路径均为脚本的所在路径,而生成exe之后点击运行,这个路径变为exe释放路径C:Users...AppDataLocalTemp_MEI*,所以log文件生成在这个路径下,在结束运行后,这个路径文件夹会被删除。
最后改这句代码为

if getattr(sys, 'frozen', False):
    pathname = sys._MEIPASS
else:
    pathname = os.path.split(os.path.realpath(__file__))[0]

参考http://blog.csdn.net/pipisorr...
此博文得到解决方案

女中豪杰 2022-09-13 00:26:07

获取当前目录用
os.getcwd()而不是os.path.dirname(__file__)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文