pyinstaller打包整個文件文件夾和相關exe,三方庫
#打包目的:完全脫離環境,只copy hello.exe去其他機器就可以完美運行
#打包命令:
pyinstaller --onefile .\xxx\hello.py --hidden-import "tkinter" --hidden-import=glob --hidden-import=lxml --add-data ".\xxx\*;." --distpath output_dir --add-data c:\h1.exe;.
--onefile:以hello.py為入口文件,將整個程序打包為一個hello.exe文件
--hidden-import:打包時手動把需要的library打包進去
--add-data ".\xxx\*;.":打包時將xxx folder下的所有文件打包到exe的根目錄下
--distpath output:生成.exe的路徑
問題1:
cmd = sys.executable + " example.py" #調用執行程序的python腳本去執行example.py
如果py腳本里有sys.executable調用當前python去執行其他python腳本,sys.executable在python腳本是執行腳本的當前python, 而打包后的sys.executable則是h1.exe,所以會調用hello.exe執行.py,這樣就會報錯
解決方法:
將調用的.py腳本再次打包成為h1.exe,然后再在.py腳本里用c:\xxx\h1.exe代替sys.executable .py,這樣就可以完全脫離python依賴
這樣在當前電腦可以運行,但如果換個電腦不把h1.exe放到指定路徑就會提示找不到h1.exe
問題2:
換電腦執行hello.exe提示找不到h1.exe,因為只把hello.exe單獨copy過去執行,h1.exe沒有copy,我們期望的是只把hello.exe copy過去就行,不需要copy其他依賴文件
解決方法:
#在相關.py腳本里定義這個函數,然后調用它獲取真實的文件路徑
#sys._MEIPASS這個屬性只有在python腳本被打包成h1.exe后執行exe才會有值,這個路徑如下所示
#sys._MEIPASS: C:\Users\ADMI\AppData\Local\Temp\_MEI12346
#執行hello.exe后會在該路徑下解壓相關文件,你可以看到你打包的文件布局
import sys
def resource_path(relative_path):
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath("."), relative_path)\n
浙公網安備 33010602011771號