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

在没有打包成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)
阅读 14.9k
2 个回答

其实有生成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...
此博文得到解决方案

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题