概述
问题: 在Macbook上打包,在终端运行: pyinstaller -F -w gui_main.spec
生成的macbook application,双击后运行闪退了。奇怪的是运行上面的gui_main.exe正常。
此处已经配置相关目录:
base_dir ='/Users/xxx/Documents/xxx/xxx/source/'
a = Analysis(['gui_main.py'],
pathex=[base_dir],
binaries=[],
datas=[(base_dir+'datalib','datalib'),(base_dir+'comm','comm'),
(base_dir+'listener','listener') ,(base_dir+'test_middle_file','test_middle_file'),
(base_dir,'ip_start_file.json'),(base_dir+'log','log')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
分析 : 将新加的log自定义创建实例这句话注释之后,可以正常运行,估计还是路径的问题导致闪退 ,获取绝对路径 :"/".join((os.path.abspath('.'), "log")) 里是想在根目录下,comm上一层创建一个log文件夹。 运行.app之后显示目录是在一个临时文件目录 ,
当程序退出时会被删,并且修改记录不会保存。嚓···除:/var/folders/q7/hrwn7c9x4rbdfql6hj2qy1s00000gr/T/_MEIfGkAI7/comm/mylog.pyc
# 当前目录下的包:source|
# comm
# | mylog.py
#
mLogger = Logger(level="debug", log_dir="/".join((os.path.abspath('.'), "log")))
解决:为了方便查看log,把生成的log目录放在app运行目录下,
所以,将获取绝对路径改,首先在根目录下(source目录),创建一个frozen.py,获取当前py的绝对路径,然后其他子模块包引用这个py,找到根目录,所有操作使用文件、目录的地方都以他为基准,转成绝对路径。(针对一些资源文件,如.json.csv之类文件操作)
#frozen.py
def app_path():
"""Returns the base application path."""
if hasattr(sys, 'frozen'):
# Handles PyInstaller
return os.path.dirname(sys.executable)
return os.path.dirname(__file__)
然后需要用exe运行根目录包下,可以以此方式引用,然后操作根目录:
CURRENT_DIR = os.path.split(os.path.abspath(__file__))[0] # 当前目录
config_path = CURRENT_DIR.rsplit('/', 1)[0] # 上1级目录
sys.path.append(config_path)
import frozen_dir
ROOT_PATH = frozen_dir.app_path()
最终打印log封闭对象写法如下,目前运行正常:
mLogger = Logger(level="debug", log_dir=os.path.join(ROOT_PATH, "log")) # 全局实例
可以看操作的资源文件 test_middle_file,log都可以在当前运行.app资源里面方便找到。
最后
以上就是眯眯眼铅笔为你收集整理的python2.7 打包程序 Application 运行闪退 Macbook的全部内容,希望文章能够帮你解决python2.7 打包程序 Application 运行闪退 Macbook所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复