python项目(包含多个python文件)打包成exe文件
首先,我的文件结构是这样的:
UTool是整个python项目文件,里面包含packs文件夹,rcat_images文件夹,主函数main.py
其中packs里面包含若干py文件,rcat里面是图片文件
此文是用pyinstaller完成的。
首先安装pyinstaller,pip install pyinstaller
1.将所有文件放于主文件夹下(这里是UTool),主文件夹里面可包含多个文件和文件夹
2.打开cmd,切换到UTool路径下,输入:
pyi-makespec main.py
生成main.spec文件
制作spec文件
#-*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['main.py',
'D:\\Study\\pythonProject\\UTool\\packs\\__init__.py',
'D:\\Study\\pythonProject\\UTool\\packs\\auto_open.py',
'D:\\Study\\pythonProject\\UTool\\packs\\clike.py',
'D:\\Study\\pythonProject\\UTool\\packs\\code_reader.py',
'D:\\Study\\pythonProject\\UTool\\packs\\complexity_analyse.py',
'D:\\Study\\pythonProject\\UTool\\packs\\control.py',
'D:\\Study\\pythonProject\\UTool\\packs\\csharp.py',
'D:\\Study\\pythonProject\\UTool\\packs\\gdscript.py',
'D:\\Study\\pythonProject\\UTool\\packs\\go.py',
'D:\\Study\\pythonProject\\UTool\\packs\\java.py',
'D:\\Study\\pythonProject\\UTool\\packs\\javascript.py',
'D:\\Study\\pythonProject\\UTool\\packs\\js_style_language_states.py',
'D:\\Study\\pythonProject\\UTool\\packs\\js_style_regex_expression.py',
'D:\\Study\\pythonProject\\UTool\\packs\\lua.py',
'D:\\Study\\pythonProject\\UTool\\packs\\objc.py',
'D:\\Study\\pythonProject\\UTool\\packs\\php.py',
'D:\\Study\\pythonProject\\UTool\\packs\\print_error.py',
'D:\\Study\\pythonProject\\UTool\\packs\\python.py',
'D:\\Study\\pythonProject\\UTool\\packs\\Resource_Calculate.py',
'D:\\Study\\pythonProject\\UTool\\packs\\ruby.py',
'D:\\Study\\pythonProject\\UTool\\packs\\rubylike.py',
'D:\\Study\\pythonProject\\UTool\\packs\\scala.py',
'D:\\Study\\pythonProject\\UTool\\packs\\script_language.py',
'D:\\Study\\pythonProject\\UTool\\packs\\swift.py',
'D:\\Study\\pythonProject\\UTool\\packs\\ttcn.py'],
pathex=['D:\\Study\\pythonProject\\UTool'],
binaries=[],
datas=[('D:\\Study\\pythonProject\\UTool\\rcat_images','rcat_images')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=['matplotlib','numpy','pandas'],
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,
[],
exclude_binaries=True,
name='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='main')
(1)第一个列表中写所有的py文件,与main一个文件夹的可以直接写文件名,不一个文件夹的需要写完整的文件路径。
(2)datas是中的元素是tuple类型,tuple的第一个参数是python项目中data文件(非py文件)的路径,
第二个参数是data在exe中保存此资源的文件夹名,要和项目中的文件夹名相同
(3)excludes里面可以填写不用的包名,这样打包以后会小点,例如:matplotlib等
(4)因为main.py是入口文件,所以被调用的其他py文件的当前路径都是main.py文件的当前路径。所以在源代码中就一定要把main.py放到最外层的项目文件夹中。在main.py中饮用了其他py文件,main.py文件要能在当前路径下找到其他文件。
3.用配置好的spec文件制作exe:
pyinstaller -D main.spec
使用-D制作出来的exe比使用-F的快很多,因为-F把所有dll文件都打包到一个exe中了(-F这时候exe会很大,加载变慢,推荐-D)。