pyinstall打包相對路徑問題
阿新 • • 發佈:2022-03-28
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檔案無效