关于使用Pyinstaller 打包 PySide2的一些问题

@[TOC]关于使用Pyinstaller 打包 PySide2的一些问题

关于使用Pyinstaller 打包 PySide2的一些问题

2019年11月20日:单独测试了13个库文件,均能够正常打包。
首先:感谢几位博主的博文,尤其是cx_Freeze,我大部分使用的原博主的源码,稍做修改。
直奔主题:本次我尝试了两种PySide2的打包方式,分别是cx_Freeze,和PyInstaller。
cx_Freeze:配置比较清晰明了,打包也很快,但是我在将打包好的文件拷贝到别的电脑上运行时,报错。暂时我没有去解决这个问题。
Pyinstaller:配置比较繁琐,报出的错误各种各样,不容易准确定位,不过最后还是实现了打包和拷贝到别的电脑上运行的基本需求

补充:(均亲测可用)
1.把pyinstaller生成的exe打包成为安装包方法,参考:https://blog.csdn.net/RNG_uzi_/article/details/103287684。
2. 分享一个icon生成网站,用图片可直接生成icon:http://www.bitbug.net/

Cx_Freeze

Cx_Freeze打包过程中遇到的问题,我有点记不住了,下面粘贴出我最后调试好的代码:


import sys
import traceback
from cx_Freeze import setup, Executable
import msilib #用于打包成msi安装文件,本文件尚未使用

product_name = u'异体'.encode('gbk')
unproduct_name = u'卸载异体'.encode('gbk')
product_desc = u"异体客户端程序 Ver1.0".encode("gbk")
product_code = msilib.gen_uuid()

build_exe_options = {
    "include_files":["images",'data'],        #包含外围的ini、jpg文件,以及data目录下所有文件
    "packages": ["os","sys","ctypes","win32con"],                #包含用到的包
    # "includes": ["PIL","traceback","atexit"], 
    # "excludes": ["tkinter"],                #提出wx里tkinter包
    "path": sys.path ,                      #指定上述的寻找路径
    'include_msvcr': True
}



base = None
if sys.platform == 'win32':
    base = 'Win32GUI'

options = {
    'build_exe': build_exe_options
}

executables = [
    Executable('svgdemo.py', base=base, icon = 's.ico') #需要打包的主文件以及文件图标
]

setup(name='simple_PyQt5',
      version='0.1',
      description='Sample cx_Freeze PyQt5 script',
      options=options,
      executables=executables
      )


```cmd
cd至你需要打包的文件目录,执行
python setup.py build #build 参数可以更改,具体参考官方说明

关于使用Pyinstaller 打包 PySide2的一些问题_第1张图片

Pyinstaller

Pyinstaller打包过程和打包完成后运行exe均容易报出各种问题,需要耐心解决:
打包过程中
1.检查初次出错的地方,如果缺少重要的模块文件(库文件)尽量安装;
2.系统找不到指定文件,将路径、隐藏模块、相关模块配置好再打包;参考官方文档或者下边的package程序
打包完成运行过程中:
1.ImportError: DLL load failed: 找不到指定的模块。库版本问题,一般来说更新以后即可:
2.ModuleNotFoundError: No module named ‘XXX’。添加搜索路径:-p DIR 例如:-p c:/user
一般而言,解决了上述问题,就可以正常运行了
上述问题只是我打包过程的经验,仅供参考。但是我遇到的问题有点特殊:
1.只用 pyinstaller svgdemo.py,我会出现:win32ctypes.pywin32.pywintypes.error: (2, ‘LoadLibraryEx’, ‘系统找不到指定的文件。’),的报错
2.如果只用package.py,运行时会提示:ModuleNotFoundError: No module named 'PySide2’等提示:如果打包后的窗口一闪而过,可以通过CMD命令行运行,cmd窗口会提示哪里出错 。 删除线部分产生的原因是:我调用了–exclude-module ,这个参数设置是用来指定打包时不需要包含的模块,所以最后会报缺乏某些模块的错误。
解决方案:先运行package.py,再运行svgdemo.py,原理我暂时也不清楚
提示:如果上次运行出错,要将 名称.spec 和 dist目录下的文件删除,再重新打包
首先是package.py:

#package.py
import PyInstaller.__main__
import os
path = 'C:/Users/mujia/AppData/Local/Programs/Python/Python36/Lib/site-packages/'

os.system('CHCP 65001') #解决报和Unicode有关的错
package_name = 'UAVM' #文件夹和exe的名称
PyInstaller.__main__.run([
    '--name=%s' % package_name,
    '-p = C:/Users/mujia/AppData/Local/Programs/Python/Python36/Lib/si在这里插入代码片te-packages/', #模块路径
    '-p=C:/Users/mujia/AppData/Local/Programs/Python/Python36/Lib/site-packages/shiboken2/',
    '-p=C:/Users/mujia/AppData/Local/Programs/Python/Python36/lib/site-packages/PySide2',
    '-p=c:/users/mujia/appdata/local/programs/python/python36/lib/site-packages/typing.py',
    '--hiddenimport=PySide2', #隐藏模块
    '--hiddenimport=pyproj',
    '--exclude-module=PySide2',
    '--exclude-module=matplotlib', 
    '--exclude-module=pyproj',
    '--exclude-module=coordinates',
    '--exclude-module=math3d',
    '--exclude-module=numpy',
    os.path.join('svgdemo.py')
])

这就可以打包好一个exe文件。

#Python查询导入模块的路径
import PySide2
print(PyDide2.__file__)

运行package.py之后,在命令行窗口中运行:

 pyinstaller svgdemo.py #我用的是vscode。cmd和powershell应该也可以

最后显示:55413 INFO: Building COLLECT COLLECT-00.toc completed successfully.表明打包成功,这里将再生成一个exe,也是我最终使用的exe。
打包完成后:点击dist\svgdemo 下的exe文件,直接运行或者拷贝至别的电脑测试一下。其余配置需求,请参照官方文档探索。
关于使用Pyinstaller 打包 PySide2的一些问题_第2张图片补充:1.如果重新打包,一定要将和本次打包不相关的 .spec和dist内的不相干文件删除掉。包括本次打包错误遗留的。
2.报错:***FileNotFoundError: [Errno 2] No such file or directory: ‘C:\Users\mujia\AppData\Roaming\pyinstaller\bincache00_py36_64bit\build\new_mission\new_mission.exe.manifest’。***一般再执行一次 pyinstaller svgdemo.py 就没问题,如果再次执行还有错,需要考虑是否是隐藏模块等为导入完整。
3.如果在Package包中使用了__init__.py文件,该文件不能为空。虽然在python编译的时候不会有问题,但是在打包的时候会出现:win32ctypes.pywin32.pywintypes.error: (2, ‘LoadLibraryEx’, ‘系统找不到指定的文件。’)
4.QWebEngineView,运行正常,但是打包后运行就是空白,通过将PySide2整个文件夹拷贝到dist目录下,运行正常,暂时不确定少的是哪个文件。 经过反复查找:qt.conf文件是根源所在,打包后,将qt.conf复制到发布文件的PySide2下,正常运行

你可能感兴趣的:(编译,python,PySide)