python程序打包

本文最后更新于 2024年5月16日。

  • **减少或者避免打包过程中的warning:

  之所以各种报错,是因为打包的时候将各种不需要的环境打包进去了,因此解决方法只需要将需要的python库打包进去即可。
  新建一个虚拟环境,除了自带的pip,setuptools这些,其他先不要安装,然后看你的打包软件中需要安装哪些库,逐个安装上,再尝试打包

但实际上我个人电脑有虚拟环境,打包后不能运行,公司电脑从来没有设置过虚拟环境,打包后可以运行。

虚拟环境原理与使用:https://blog.csdn.net/qq_44643484/article/details/123251333

  • **obsidian按住ctrl后回车可以把当前行变成待办
  • **打包后运行出错:VCRUNTIME140.dll 没有被指定在Windows运行

[我的方法]找到打包后因为dll文件问题无法运行的原因了,因为upx压缩导致dll不可用,删除upx或者换个名字就可以了。

[验证无效]搜索解决办法:在控制面板-程序与功能中修复Microsoft Visual C++ Redistributable 最新版。

  • **pyinstaller打包时提示UPX is not available.

    查了一下, 原来是pyinstaller使用UPX压缩, 所以根据下面的步骤安装了一个UPX就好了:
    (1) 到官网 https://upx.github.io/ 下载了UPX(我的是Window 32版本), 下载下来是一个压缩包
    (2) 解压得到 upx.exe文件
    (3) 把exe文件拷贝到pyinstaller目录下

————————————————

  • **ModuleNotFoundError: No module named ‘backcall’

    用pip安装即可

pip install backcall
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting backcall
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/4c/1c/ff6546b6c12603d8dd1070aa3c3d273ad4c07f5771689a7b69a550e8c951/backcall-0.2.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: backcall
Successfully installed backcall-0.2.0

多个python版本时进入特定python文件夹运行就能安装库给特定版本:

python -m pip install packages

或者使用py -version -m pip install packages, -version为版本号,packages为包名,比如给python3.5安装numpy

py -3.5 -m pip install numpy
  • **python pip 命令 WARNING: Ignoring invalid distribution ip的解决方案

 

[问题描述]:在使用python pip 命令时提示WARNING: Ignoring invalid distribution ip
[解决方案]:在相应目录下(本人目录为:D:\Program\python\Lib\site-packages)找到ip文件夹,如图所示,删除下面这两个文件夹即可。

  • pyinstaller打包
pyinstaller -F [filename].py

去除命令行黑框

pyinstaller -F -w [filename].py

其中_pycache_,build,dist 这三个文件夹都是打包过程中自动生成的,并不是原先存在的,现在就来说说打包一个EXE生成的这四个东西分别有什么用!

  1. pycache 生成的临时pyc项目文件。
  2. build里都是些日志以及生成过程中用到的文件(如果你打包后的EXE运行有问题,你厉害的话可以查里面的日志找到错误点,日志全英文(找关键词error)
  3. dist文件夹存放生成后的exe文件(你生成的EXE文件就在里面,不过如果你的EXE文件里有路径,那么别在这里运行(不然你就傻了),因为会找不到路径,欢迎去了解一下绝对路径和相对路径的区别!!!)
  4. 购物系统是生成后的文件名,所以购物系统.spec是他生成时的配置文件。
那么整套的打包流程就结束了,但是接下来的才是高级编程师要看的,上面的仅仅是打包单个文件,而且打包出来的EXE连个图标都没有,就是给新手用的!!!
想要知道更高级的玩法,那么就必须了解pyinstaller的参数使用了
-F, –onefile    打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用
-D, –onedir 打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,我个人比较推荐这样,代码易于维护
-K, –tk 在部署时包含 TCL/TK
-a, –ascii  不包含编码.在支持Unicode的python版本上默认包含所有的编码.
-d, –debug  产生debug版本的可执行文件
-w,–windowed,–noconsole 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)
-c,–nowindowed,–console
使用控制台子系统执行(默认)(只对Windows有效)
pyinstaller -c  xxxx.py
pyinstaller xxxx.py --console
-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参数来设置多个导入路径,让pyinstaller自己去找程序需要的资源
–icon=<FILE.ICO>
将file.ico添加为可执行文件的资源(只对Windows系统有效),改变程序的图标  pyinstaller -i  ico路径 xxxxx.py
–icon=<FILE.EXE,N>    将file.exe的第n个图标添加为可执行文件的资源(只对Windows系统有效)
-v FILE, –version=FILE  将verfile作为可执行文件的版本资源(只对Windows系统有效)
-n NAME, –name=NAME 可选的项目(产生的spec的)名字.如果省略,第一个脚本的主文件名将作为spec的名字

温馨提示:在代码当中尽量不要用import,能from…..import….就尽量用这个,如果是import的话,在打包的时候,会将整个包都打包到exe里面,那么就会增大工打包后的EXE的大小!(如果Python基础学的扎实的话,很清楚import 和 from …. import… 的区别,学编程基础真的很重要,基础学好,对后面的编程真的很舒服)

在base环境中打包exe会发生文件过大

下面这种方法作用不大,以前是三百兆,虚拟环境中安装pyinstaller后还有250多兆。

首先我已经知道,在base环境中打包exe会发生文件过大,有几百M的情况,在虚拟环境中打包则可以缩小很多。
但是我今天在虚拟环境中打包的时候犯了一个低级错误,导致浪费了我半个小时。就是我 忘 记 在   虚 拟  环境中安装pyinstaller!这样在打包的时候,还是会用到base环境的pyinstaller执行,并且引入的是base环境下的包,很多无关包的都会被打包进来。
在打包完成后,我看文件有300多M,我第一时间没发现这个问题。在尝试第二遍以后才发现控制台显示的目录都是base环境的。这个时候我才意识到我又犯二了。
在虚拟环境下安装pyinstaller后,再执行打包指令,恢复正常,exe减小到26M,算是可以接受的大小。