利用pyinstaller生成exe之后,运行不能正常产生结果文件问题记录

https://segmentfault.com/q/1010000011284617/a-1020000011493026

在此链接已解决问题,现在在这里在详细记录一次

问题描述:

利用pycharm或是直接点击运行py文件,可正常生成log文件,利用pyinstaller打包成exe之后,运行不能生成log文件。

问题原因:

问题出在path = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'log', self.loggerName)中的os.path.dirname(__file__),在pycharm中运行和生成exe之后os.path.dirname(__file__)返回的位置不一样。

使用pycharm和直接点击运行py文件,这个路径均为脚本的所在路径,而生成exe之后点击运行,这个路径变为exe释放路径(C:\Users\...\AppData\Local\Temp\_MEI***)

问题解决:

在代码里增加一个判断

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

 

相关知识点整理

1、如果是运行pyinstaller生成的exe文件,会在sys中添加一个_MEIPASS(即exe释放路径C:\Users\...\AppData\Local\Temp\_MEI***)和一个frozen [It also adds the attributes frozen and _MEIPASS to the sys built-in module]

2、getattr(object, name[, default])

如果object对象存在有name属性,则返回name属性值或name为方法则返回name的内存地址;

如果object对象不存在有name属性,则返回default,如果default没给,就会触发 AttributeError。

if getattr(sys, 'frozen', False):

判断sys是否存在有‘frozen’,如果没有,就返回False,有的话,返回frozen的属性值,并执行if语句。

3、os.path.realpath()

获得的是该方法所在的脚本的路径

上一篇:兼容所有浏览器的设为首页收藏本站js代码


下一篇:jsonp 演示实例 —— 基于node