一文带你搞定python脚本(.py)打包为可执行文件(.exe)
文章目录
- 一文带你搞定python脚本(.py)打包为可执行文件(.exe)
- 01、为什么要打包Python脚本?
- 02、打包步骤?
- 第一步:环境配置与操作包安装
- 第二步:开始打包
- 第三步:输入打包命令
- ICO图片生成
- 示例:
- 总结:
- 03、多个.py文件打包
- import 和 from ... import *用法区别
- 解决方法(!!!打包可执行文件时报错找不到模块)
01、为什么要打包Python脚本?
Python脚本打包的主要目的是为了方便程序的分发和部署。通过打包,可以将所有必要的文件、依赖项和配置打包到一个可执行的文件或者安装包中,这样用户就不需要手动安装各种依赖库,只需运行打包后的程序即可。另外,打包也可以保护源代码,避免源代码被篡改或者泄露。这在商业软件或者需要保护知识产权的情况下尤为重要。同时,打包还能够简化程序的部署流程,减少用户可能遇到的配置问题,提高软件的易用性和稳定性。
总的来说,Python脚本打包可以提高程序的可移植性、安全性和用户体验。
02、打包步骤?
第一步:环境配置与操作包安装
方式一:打开cmd,进入到Python工程项目目录下输入如下命令
方式二:直接在PyCharm终端环境下输入如下命令
pip install pyinstaller
运行命令后,显示:Successfully inatslled pyinstaller—3.6即安装成功
第二步:开始打包
-
单个.py文件打包
进入cmd窗口后,使用cd命令进入到该文件所在文件夹下,如下图:
项目文件夹在E盘,需要先将cmd的当前目录改为D盘(命令为:
D:
)再用cd命令更改路径。
第三步:输入打包命令
pyinstaller -F -w (-i icofile) 文件名.py
解释一下上述命令的参数:
- -w 表示在打包好程序后,双击.exe文件不会出现黑色的命令窗口。(如果你的程序有print等输出命令,就会有黑洞洞的控制台窗口出来,输出的内容就在此命令窗口中显示)
- 括号中的内容是可以省略的,-i 表示给.exe文件一个图标,icofile表示图标的文件名,图标的图片格式为.ico格式的。不懂.ico图片的可以百度一下,打包时如果需要给.exe加入图标,将图标文件放到和.py文件同一目录下即可。
- 文件名.py 这里的文件名是你要打包的.py文件的名称,例如上述例子为“樱花.py”。
ICO图片生成
如果想给自己做的软件放上期望的图标,如何找到喜欢的ico图片呢?
- 一是找专门的ico图片网站,不过都很小众,图片库也很小。
- 另一个是可以自己制作,这里就给大家分享一个网站,可以把其他格式图片转成ico格式:
https://app.xunjiepdf.com/img2icon/
示例:
我要打包的文件是樱花.py,需要导入的图标是樱花.ico文件,具体操作如下:
运行结果如下:
总结:
Pyinstaller -F py_word.py 打包exe
Pyinstaller -F -w py_word.py 不带控制台的打包
Pyinstaller -F -w -i chengzi.ico py_word.py 打包指定exe图标打包
03、多个.py文件打包
有时候我们会利用Python开发一个包含GUI界面的小工具、小程序等等,这样的文件就不是一个简单的.py文件,如此一来想要打包包含多个.py文件的文件夹该如何操作呢?
思路很简单,“擒贼先擒王‘,你直接在该文件夹路径下使用打包命令打包主文件,然后将主文件调用的模块函数、插件、图片资料以及配置文件等复制到打包后的文件夹即可。
!!!但是这样打包的文件有时候会面临一个问题,双击运行可执行文件时报错找不到对应的模块,这样导致程序无法正常启动,即使代码没有问题,这样的问题该怎么解决呢?先来看两种函数调用方法的区别:
import 和 from … import *用法区别
在Python中,import
和 from ... import *
是用来引入模块中的内容的两种不同方式。
-
import 模块名
:这种方式会将整个模块引入当前命名空间,你可以通过模块名来访问模块中的内容。例如:import math print(math.pi)
-
from 模块名 import *
:这种方式会将指定模块中的所有公开内容导入当前命名空间,你可以直接访问这些内容,而无需使用模块名作为前缀。例如:from math import * print(pi)
使用 import
的优点是可以清晰地看出引入的内容来自哪个模块,不容易造成命名冲突;而使用 from ... import *
的优点是可以直接访问模块中的内容,不需要使用模块名作为前缀,方便简洁。但是,在实际开发中,不推荐频繁使用 from ... import *
,因为这样可能会导致命名冲突或者代码可读性下降。
总结来说,import会导入调用函数的整个模块,包括他自身调用的库函数;相反,如果使from方式调用,调用函数所导入的库函数会存在找不到模块的情况。因此,对于程序较为简单的建议使用from函数,如果程序相对复杂,不建议使用from方式进行调用。
解决方法(!!!打包可执行文件时报错找不到模块)
当使用PyInstaller打包Python程序时,有时会遇到打包后无法找到自定义模块的情况。这通常是由于PyInstaller默认只会打包程序所依赖的标准库和第三方库,而对于自定义模块需要进行额外的配置。
解决这个问题的方法有两种:
-
使用
--hidden-import
参数手动添加模块依赖:
在使用PyInstaller打包时,可以通过--hidden-import
参数手动添加需要打包的自定义模块。例如,如果你的程序依赖了一个名为my_module
的自定义模块,可以使用以下命令进行打包:pyinstaller --hidden-import my_module your_script.py
这样PyInstaller会将
my_module
一同打包进可执行文件中,使得运行时可以找到该模块。 -
使用
--add-data
参数指定模块的路径:
如果你的自定义模块不在Python的标准库或第三方库中,而是位于其他目录下,可以使用--add-data
参数指定模块的路径。例如,假设你的自定义模块位于/path/to/my_module.py
,可以使用以下命令进行打包:pyinstaller --add-data "/path/to/my_module.py:." your_script.py
模块位于/path/to/my_module.py
,可以使用以下命令进行打包:
pyinstaller --add-data "/path/to/my_module.py:." your_script.py
这样PyInstaller会将my_module.py
复制到可执行文件所在的目录,并在运行时能够找到该模块。