最近需要打包一個python項目成exe文件,里面有3個文件夾,和1個共享文件夾,所以需要打包多個py文件,還需要包含共享文件夾中的py文件。總之就是要將不同文件夾下的多個py文件打包。
通過了解,這里選擇使用pyinstaller庫來打包。
安裝pyinstaller:
pip install pyinstaller
有兩個打包方式:
-
使用命令行方式
pyinstaller [主文件] -p [其他文件1] -p [其他文件2] --hidden-import [自建模塊1] --hidden-import [自建模塊2]如果在py文件很多的情況下,這個方法並不好。
-
使用spec方式
-
打開終端進入項目路徑下,輸入
pyinstaller -F -c docx2xml.py(項目主文件)。執行后,會在當前目錄下生成兩個文件夾(build和dist)和1個文件docx2xml.spec。刪除那兩個文件夾,只保留docx2xml.spec。做個說明,這里的
pyinstaller -F -c docx2xml.py(項目主文件)可以寫成pyinstaller -F -w docx2xml.py(項目主文件)。只不過-c的在執行打包后的exe文件時會帶控制台,也就是DOS窗口,而-w不帶控制台。在第一次打包時,如果程序打包后有錯誤,用-c的可以在執行打包后的exe文件時直觀地看到程序報錯信息。 -
根據自己的項目編輯該文件
# -*- mode: python ; coding: utf-8 -*- block_cipher = None #此項目中所有的py文件(要打包進去的所有py文件),和主程序不在同一個包中的py文件用絕對路徑。 a = Analysis(['docx2xml.py','content.py','extract.py','head.py','image.py','processXml.py', 'D:/Desktop/PaperSystem-Python/lib/log.py', 'D:/Desktop/PaperSystem-Python/lib/misc.py', 'D:/Desktop/PaperSystem-Python/lib/procXml.py', 'D:/Desktop/PaperSystem-Python/lib/styleEnum.py', ], pathex=['D:/Desktop/PaperSystem-Python/doc2xml'], # 項目的絕對路徑 binaries=[], datas=[], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='docx2xml', #打包程序的名字 debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, # console=True表示,打包后的可執行文件雙擊運行時屏幕會出現一個cmd窗口,不影響原程序運行 console=True, disable_windowed_traceback=False, target_arch=None, codesign_identity=None, entitlements_file=None ) # 如果想要修改程序圖標,使用在EXE()中加入 icon='xxxxx', 切記:絕對路徑 -
打包
執行spec文件:
pyinstaller -F -c docx2xml.spec運行結束后,會新增dist文件夾,exe文件就在里面。(該exe文件已將所有的py文件封裝完了,可隨處使用)。
打包后遇到的一些問題
1.至此,python程序確實是打包完成了,但是還是有可能在運行時發生一些錯誤。
比如我在運行時,突然報了個錯誤,是因為在
lib包中的調用模塊處有問題:
因為
log.py和procXml.py在同一個包下,所以當時在引用時用了相對路徑。但是在打包后,程序會有錯誤。(可能是失去了相對路徑,找不到所需的模塊)所以要使用完整的調用模塊的語句。
2.原本的py程序執行時的參數都是使用命令行參數來傳參的。打包之后的傳參方式其實也一樣,只不過每次執行exe文件時都要手動輸入:

如何執行:
在執行exe文件的語句后加個空格,然后直接輸入所需命令行參數。
-
