先上spec文件配置好后的全部代码。后面详细讲解!
官方详细文档请参阅链接
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['hello.py'],
pathex=['D:\\Company\\project\\untitled',
'D:\\Company'
],
binaries=[( '/usr/lib/libiodbc.2.dylib', '.' )],
datas=[
('image/*.png','data/image'),
('pdf/*.pdf','data/pdf')
],
hiddenimports=[
'sklearn.utils._typedefs'
],
hookspath=[],
runtime_hooks=[],
excludes=['PyQt5'],
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='hello',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False )
项目路径
D:\Company为主目录,下面有2个文件夹project和util
project目录下放了项目文件untitled
util目录下放自己写的库/模板
0. a里面的script
['hello.py']
main文件入口,或者你执行文件的时候要执行多少个python文件,那就写几个,比如pyinstaller hello.py hello2.py,会依次去执行
1. a里面的pathex
pathex=['D:\\Company\\project\\untitled',
'D:\\Company'
],
意思是项目需要从什么地方导入自定义库
# hello.py文件
from mypath.util import module1 # 从D:\\Company\\project\\untitled找到mypath文件夹下面的util下面的module1
from util.module2 import * # 从D:\\Company目录下的util找到module2
2. a里面的datas
项目需要用到什么数据,比如图片,视频等。里面格式为tuple,第一个参数是文件路径,第二个是打包后所在的路径。
下面的代码意思就是,把image下面的所有以png结尾的文件打包到exe所在目录下的data/image目录下。把pdf目录下的test.pdf文件打包到exe所在目录的data/pdf目录下。
datas=[
('image/*.png','data/image'),
('pdf/test.pdf','data/pdf')
],
3. a里面的hiddenimports
hiddenimports=[
'sklearn.utils._typedefs'
],
官方解释
Normally PyInstaller learns about .so and .dll libraries by analyzing the imported modules. Sometimes it is not clear that a module is imported; in that case you use a --hidden-import command option. But even that might not find all dependencies.
假如打包后打开exe显示module not found,就要把该库添加到hiddenimports里面了。
4. a里面的binaries
动态库
binaries=[( '/usr/lib/libiodbc.2.dylib', '.' )],
5. a里面的excludes
excludes=['PyQt5']
假如你用的python有很多库,但是你不需要用到某个,那么就把它添加到里面去,比如很多人没有用到PyQt5, pandas