pyinstall打包相對路徑問題
pyinstaller 打包py文件成exe文件,在沒有python的機器上運行,執行打包后的程序,經常會出現程序使用的圖標無法顯示,程序使用的關聯文件無法關聯。或者,在打包的本機上運行正常,但是將打包后的程序放到其它機器上就有問題。這些現象都很有可能是由程序使用的文件路徑發生改變產生的,因此在打包時候我們需要根據執行路徑進行路徑“凍結”。
1. 使用絕對路徑
在python代碼中使用絕對路徑調用外部文件可以保證打包時候路徑可追溯,因此在本機上運行打包后程序基本沒問題。但是當本機上對應路徑的資源文件被改變,或者將打包程序應用到別的機器,都會出現搜索不到資源文件的問題。這種方式不是合適的打包發布python軟件的方式。
2. 使用凍結路徑
增加一個py文件,例如叫: frozen_dir.py
-*- coding: utf-8 -*-
import sys
import os
def app_path():
"""Returns the base application path."""
if hasattr(sys, 'frozen'):
# Handles PyInstaller
return os.path.dirname(sys.executable) #使用pyinstaller打包后的exe目錄
return os.path.dirname(__file__) #沒打包前的py目錄
其中的app_path()函數返回一個程序的執行路徑,為了方便我們將此文件放在項目文件的根目錄,通過這種方式建立了相對路徑的關系。
源代碼中使用路徑時,以app_path()的返回值作為基准路徑,其它路徑都是其相對路徑。以本文中使用的python項目打包為例,如下所示: test.py
# -*- codling: utf-8 -*-
import os
import frozen_dir
def savelog(file,log):
dirname = os.path.dirname(file)
if not os.path.exists(dirname):
os.mkdir(dirname)
with open(file,'a',encoding='utf-8') as f:
f.write(log+'\n')
if __name__=='__main__':
file = frozen_dir.app_path()+r'\log\2.txt'
print(file)
savelog(file,'hello you')
savelog(file,'文件路徑%s' %(file))
注意:
1、pyinstaller -D test.py 生成exe文件有效
2、pyinstaller -F test.py 只生成單獨exe文件無效