一.前言

在本次这个模块,我将针对pycharm上使用pyinstaller打包exe文件的过程进行分析,包括一些bug的改正。

本次环境是:python 3.8

打包的类:matplotlib、numpy、cv2

二.pyinstaller安装

2.1 pycharm打开Terminal对话框:

View->Tool Windows->Terminal

2.2 安装pyinstaller

pip install pyinstaller

2.3 相关参数
-F  打包成一个exe文件,小项目可以采用,打开比较慢,多个.py打包时不能使用
-D  默认参数,打包结果放入到创建的文件夹中,可以看到里面有很多的依赖文件
-w  使用项目的GUI界面,无cmd控制台
-c  默认参数,使用cmd控制台 如果打包文件执行报错,可尝试用-c 显示控制台

-n  执行项目的名称,默认.py的文件名
-i  将ico图标打包到exe文件中
--onefile 将结果打包成一个可执行文件
--onedir 将所有结果打包到一个文件夹中,该文件夹包括一个可执行文件和可执行文件执行时需要的依赖文件(默认)
--paths=DIR 设置导入路径
--distpath=DIR 设置将打包的结果文件放置的路径
--specpath=DIR 设置将spec文件放置的路径
--windowed 使用windows子系统执行,不会打开命令行(只对windows有效)
--nowindowed 使用控制台子系统执行(默认)(只对windows有效)
--icon=<FILE.ICO> 将file.ico添加为可执行文件的资源(只对windows有效)
 
如果脚本导入了模块,需要加入选项--hidden-import=(模块名)
 

三. pyinstaller使用(以cv_1.py为例子)

pyinstaller -F -w cv_1.py

大多数情况下,这种即可实现,会生成三个文件,build、dist、cv_1.spec

pycharm python多文件项目 打包 pycharm打包多个py_ci

 

cv_1.spec详细细节

# -*- mode: python ; coding: utf-8 -*-


block_cipher = None


a = Analysis(['cv_1.py'],
             pathex=['D:\\Pycharmdetail\\venv\\Lib\\site-packages'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             hooksconfig={},
             runtime_hooks=[],
             excludes=[],
             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='cv_1',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True,
          disable_windowed_traceback=False,
          target_arch=None,
          codesign_identity=None,
          entitlements_file=None )

 在dist中存在有自己的exe可执行文件,运行即可

四.可能遇到的debug

主要是针对我在打包遇到的情况

4.1 exe屏幕闪退

这种情况可以在Terminal中来运行exe文件,即可把结果保留。

4.2 no module named "XXX"

我这边的情况是没有把相对应的包打包进去,pycharm这边是自己存在有lib,里面存放了site-packages,我们需要在settings中找到包所在的地方

pycharm python多文件项目 打包 pycharm打包多个py_pycharm_02

 

 改正代码如下:

pyinstaller -F cv_1.py -p D:\Pycharmdetail\venv\Lib\site-packages

4.3 numpy无法导入

首先是显示

pycharm python多文件项目 打包 pycharm打包多个py_可执行文件_03

问题 

这个问题很艹蛋,我查阅了好多资料,后来仔细一看是numpy上面出现了问题

1.numpy版本过高,不匹配【未解决】

2.在上面的spec文件中, hiddenimports=['numpy']来加入所缺的类【未解决】

3.后来可能是觉得numpy的多重版本问题,我发现本电脑python中存在D:\python\Lib\site-packages,其中存在有numpy, 之前pycharm的库中,同样存在numpy,我发现这两个版本是不一样的,我直接将pycharm中numpy1.16.1的版本直接覆盖python中,同样的操作,发现最后实现打包。

5. 结果

本实验是简单实现一个canny的功能,最终呈现结果。

简单用小学妹的照片尝试一下!开心!

pycharm python多文件项目 打包 pycharm打包多个py_python_04