最近需要打包一个python项目成exe文件,里面有3个文件夹,和1个共享文件夹,所以需要打包多个py文件,还需要包含共享文件夹中的py文件。总之就是要将不同文件夹下的多个py文件打包。
通过了解,这里选择使用pyinstaller库来打包。
pip install pyinstaller
1
有两个打包方式:
使用命令行方式
pyinstaller [主文件] -p [其他文件1] -p [其他文件2] --hidden-import [自建模块1] --hidden-import [自建模块2]
1
如果在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文件的语句后加个空格,然后直接输入所需命令行参数。
————————————————
版权声明:本文为CSDN博主「蛋头弹头」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_46095164/article/details/121645608
联系客服