Python Pyinstaller 打包程序及遇到的问题总结

一、如何打包py程序

1、安装打包模块

pip install pyinstaller

2、定义保存包的路径 CMD ,CD

  比方:把最终*.exe运行文件,保存到H盘 install 文件夹下。

  输入: H:    CD   [自己定义文件名]

 

 3、打包生成

红字是我的py程序所在路径,--noconsol 是屏蔽黑色的控制窗口。

pyinstaller -F E:\PythonProgram\CSV\Call.py --noconsol

注意:*.py的路径中,文件夹中可以有中文,但是不能有空格。不然打包时报错。

      

执行命令后,exe文件自动生成在H盘下,build 文件可以删除掉。

       

4、给exe增加图标

pyinstaller   -i E:\PythonProgarm\CSV\sun.ico   -F E:\PythonProgarm\CSV\Call.py --noconsole

这里需要注意,程序复制到桌面才会有显示,另外上面的名字也可以写成:  pyinstaller -F  -i sun.ico  E:\PythonProgarm\CSV\Call.py --noconsole 前提是*.ico需要和*.py文件在同一文件夹下。

5、指令含义

 一些常用的功能参数,官方手册可参考:https://pyinstaller.readthedocs.io/en/stable/ 

    

 二、打包程序遇到的一些问题

问题1:关于32位和64位系统

如果是64位环境打包的程序,只能给64位的电脑使用。如果需要在32位电脑上运行怎么办呢?

    比较粗暴的方法是:使用2台电脑一台构建32位的环境,一台构建64位的环境。如果需要在64位电脑上同时打包

下面这里有另外博主的一些方法可以参考。

转载链接: https://www.hellomao.top/2019/05/25/python_pyinstaller/ 

                   https://blog.csdn.net/allan2222/article/details/88035116

问题2:运行中出现 :ImportError: unable to find Qt5Core.dll on PATH

这个问题主要是PyQt5 bug导致的,按照一些方法添加PyQt5到系统变量表中,问题没有解决。我又再网上查了一些其它方法。

解决方案:参考链接:https://blog.csdn.net/zwyact/article/details/99778898

代码前加以下代码或者使用更新版本的PyQt5

import sys, os
if hasattr(sys, 'frozen'):
    os.environ['PATH'] = sys._MEIPASS + ";" + os.environ['PATH']

 问题3:安装不上PyQt5  5.13

执行以下命令 安装不上pyqt5

pip install PyQt5    -i https://pypi.douban.com/simple

解决方案:降低Python 版本,我自己测试安装32位Windos系统的Python 3.8 版本,在pip pyqt5 时,CMD安装不上,

安装Pytnon 3.7 版本没有问题。

 

 问题4:no module named

  方法1、使用-p 指令 增加模块路径

 红字部分增加你的模块路径,路径尾部需要使用;分号。蓝字是运行程序路径。

pyinstaller  -F -p    F:\python_program\test;  F:\python_program\test\main.py 

  方法2、指定添加

 2.1:打包指定模块

命令行模式:
--hidden-import Modulename 可以多次使用
例:--hidden-import docx --hidden-import Pillow
修改spec模式:
hiddenimports=['docx'],
例:hiddenimports=['docx', 'Pillow'],

 2.2:打包指定文件

命令行模式:
--add-data file 可以多次使用,注意格式为引号里面有一个文件名,有一个分号,一个点。 

例: --add-data "default.docx;." 
修改spec模式:
datas=[('default.docx', '.')],

该方法也可以指定其它自定义的文件如:Config.Json等指定后,文件会添加到根目录下。

 2.3:打包后调用静态文件

#根据系统运行位置确认basedir路径
if getattr(sys, 'frozen', None):
basedir = sys._MEIPASS
else:
basedir = os.path.dirname(__file__)
#调用
#接上例,打包进去的default.docx,加到了.这个根目录。
docx=os.path.join(basedir, 'default.docx')

加入文件的时候,有一个参数‘.’,这是加入包的路径,后面引用的时候,如果是解压运行,就到解压目录的根目录找。
如果不是解压的,就到该文件路径下找。
如果加入更多的静态文件,可以相应的修改加入路径和引用路径。

no module named处理问题参考链接:

https://www.jianshu.com/p/bf07565f0090

https://www.cnblogs.com/jackadam/p/10342627.html

 

posted @ 2019-10-25 15:46  河岸瓶风  阅读(4097)  评论(0编辑  收藏  举报