常用命令
pyinstaller -D xxx.py //打包生成目录(director)
pyinstaller -F xxx.py//打包生成单个exe文件
pyinstaller xxx.spec //根据现有的spec文件进行打包
运行以上命令之一后会生成build、dist文件夹以及xxx.spec文件,可以通过修改.spec文件进行打包配置。
spec文件配置
打包主要修改的是Analysis()的内容,Analysis配置如下。
a = Analysis(
['xx.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={
},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
第一个[]中的内容为要打包的出口文件,即main()所在文件,pyinstaller会通过这个文件进行引包,这里只需要添加执行入口文件。
pathex包含自建库的搜索路径,对应命令行-p参数。
datas包含程序资源文件,如图片、网页等,需要按元组进行配置。(‘资源当前所在路径’,‘打包后所在路径’)
例如:datas=[(‘jieba\dict.txt’,‘.\jieba’)] 表示将当前目录的jieba\dict.txt放入打包目录的jieba文件夹下。
hiddenimport能够导入程序未能直接导入的库,若出现no module ‘xxx’时,将xxx加入hiddenimport列表中。
报错
- metadata找不到
在.spec中配置data,关键代码如下:
from PyInstaller.utils.hooks import copy_metadata
datas=[('jieba\dict.txt','.\jieba')]
datas+=copy_metadata('tqdm') + \
copy_metadata('regex') + \
copy_metadata("requests") + \
copy_metadata("packaging") +\
copy_metadata("filelock") + \
copy_metadata("numpy") + \
copy_metadata("tokenizers")
- 运行时报错find_and_load
报错代码:
File "datasets\load.py", line 58, in <module>
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "PyInstaller\loader\pyimod02_importers.py", line 499, in exec_module
File "datasets\packaged_modules\__init__.py", line 31, in <module>
File "inspect.py", line 1024, in getsource
File "inspect.py", line 1006, in getsourcelines
File "inspect.py", line 835, in findsource
OSError: could not get source code
[16480] Failed to execute script 'test' due to unhandled exception!
将报错所指的包复制到dist/xxx目录下就行。
上面的报错指示为:
"datasets\packaged_modules\__init__.py", line 31, in <module>
将第三方库datasets/复制到dist/xxx/下。