pyinstaller打包注意事项

pyinstaller是可以加密的,目前是最好用的一个,通过对比py2exe,nutika等。

环境 3.6

命令行用法:
pyinstaller.exe --key 1234567890123456 -F -w -i icon_filepath --paths=C:\Python36\Lib\site-packages\PyQt5\Qt\bin;C:\Python36\Lib\site-packages\PyQt5\Qt\plugins hello.py

参数解释:
--key 加密
-F 1个文件
-w 表示是带界面的程序。则打包后没有cmd窗口。
-i icon图标位置

完整:
-F, –onefile 产生一个文件用于部署 (参见XXXXX).
-D, –onedir 产生一个目录用于部署 (默认)
-K, –tk 在部署时包含 TCL/TK
-a, –ascii 不包含编码.在支持Unicode的python版本上默认包含所有的编码.
-d, –debug 产生debug版本的可执行文件
-w,–windowed,–noconsole 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)
-c,–nowindowed,–console 使用控制台子系统执行(默认)(只对Windows有效)
-s,–strip 可执行文件和共享库将run through strip.注意Cygwin的strip往往使普通的win32 Dll无法使用.
-X, –upx 如果有UPX安装(执行Configure.py时检测),会压缩执行文件(Windows系统中的DLL也会)(参见note)
-o DIR, –out=DIR 指定spec文件的生成目录,如果没有指定,而且当前目录是PyInstaller的根目录,会自动创建一个用于输出(spec和生成的可执行文件)的目录.如果没有指定,而当前目录不是PyInstaller的根目录,则会输出到当前的目录下.
-p DIR, –path=DIR 设置导入路径(和使用PYTHONPATH效果相似).可以用路径分割符(Windows使用分号,Linux使用冒号)分割,指定多个目录.也可以使用多个-p参数来设置多个导入路径
–icon=<FILE.ICO> 将file.ico添加为可执行文件的资源(只对Windows系统有效)
–icon=<FILE.EXE,N> 将file.exe的第n个图标添加为可执行文件的资源(只对Windows系统有效)
-v FILE, –version=FILE 将verfile作为可执行文件的版本资源(只对Windows系统有效)
-n NAME, –name=NAME 可选的项目(产生的spec的)名字.如果省略,第一个脚本的主文件名将作为spec的名字
————————

错误:1
打开命令行输入x.exe回车发现错误:ModuleNotFoundError:No module named typedefs,经过不断搜索发现是sklearn和scipy库的问题,有些库不能自动导入,
在.spec文件中将hiddenimports=[]修改为:hiddenimports=['cython', 'sklearn', 'sklearn.ensemble','sklearn.neighbors.typedefs','sklearn.neighbors.quad_tree','sklearn.tree._utils','scipy._lib.messagestream']后,再运行命令pyinstaller x.spec,等它跑完之后再点击.exe文件会发现这个错误没有了~(好像是和pandas,scipy,sklearn相关的导入错误都可以这样QAQ)

错误:2
错误:This application failed to start because it could not find or load the Qt platform plugin "windows"。
缺少Qt组件无法正常启动,参考网上的评论,需要有...\Qt\plugins\platforms这个文件夹,把这个文件夹拷贝到和.exe文件一个路径下,最终完美解决,出现了想要的Qt界面~

需要注意的问题:

3.1 如果你的GUI程序带有图片(或者其它资源)的文件夹(我的是在\res文件夹下),需要把这个文件夹拷贝到.exe文件同一路径下。

3.2 如果你的.py文件不止一个,仅仅需要把其它.py文件都放在一个目录下,只对入口.py文件打包即可。

错误:4
database error: driver not loadd driver not loaded
复制 C:\Python36\Lib\site-packages\PyQt5\Qt\plugins 里面的 sqldriver 文件夹到exe所在目录。

错误:5
路径问题:

spec文件举例:
# -*- mode: python -*-

block_cipher = pyi_crypto.PyiBlockCipher(key='0123456789123456')


a = Analysis(['1.py', '2.py'],
pathex=['D:\\0软件设计\\aa软件版'],

binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='XX.exe',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=False ,

icon='XXXX.ico')

——————
pyinstaller xx.spec

 

千万注意,如果pyinstaller文件夹内放入UPX后,虽然可以压缩文件,但不知道为什么,打包带pyqt5的代码,exe运行会导致下面的错误。
切记,切记。

DLL load failed: 内存位置访问无效。
Traceback (most recent call last):
File "xunlei_cdk_jihuo_0811.py", line 29, in <module>
File "c:\python36\lib\site-packages\PyInstaller\loader\pyimod03_importers.py",
line 714, in load_module
module = loader.load_module(fullname)
ImportError: DLL load failed: 内存位置访问无效。

猜你喜欢

转载自www.cnblogs.com/guangzhao17/p/9484661.html