1. 程式人生 > 其它 >pyinstall打包相對路徑問題

pyinstall打包相對路徑問題

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檔案無效