第一点是,pyinstaller打包需要指定程序中使用的库的路径,新手在这一点上很容易出现问题,导致打包后的exe程序执行的时候显示缺少模块。这个问题可能并不能通过简单地指定路径来解决。
第二点就是使用虚拟环境本身的好处了:
当你进入一个conda虚拟环境后(conda activate xxx),可以使用conda install和pip install安装不同的包,因为某些包可能在conda源中没有。
虚拟环境的创建和使用很简单,不是本文的主题,这里不赘述了。
PyInstaller 是一个用于将 Python 程序打包成可执行文件的强大工具。它允许你将你的 Python 代码、依赖项和解释器一起打包成一个独立的可执行文件,无需用户安装 Python 或其他依赖项。
首先进入项目所在的虚拟环境:
打开Anaconda Powershell Prompt(为什么不直接用Powershell?可以,但不建议,你可以从我本专栏前面的文章找到答案),进入项目所在虚拟环境:
conda activate yt_dlp_env
安装pyinstaller:
conda install pyinstaller
现在,先看第三节:实际使用示例,然后再回来看第二节。
假设你有一个名为 my_script.py 的 Python 脚本,想将其打包成可执行文件。你可以在命令行中执行以下命令:
pyinstaller my_script.py
这将在当前目录下创建一个 dist 文件夹,其中包含了可执行文件。你可以在 dist 文件夹中找到 my_script(或 my_script.exe,取决于你的操作系统)可执行文件。
如果你的项目包含多个文件,你可以将整个项目目录作为参数传递给 PyInstaller。例如:
pyinstaller my_project_directory
这将在 dist 文件夹中创建一个可执行文件,其中包含了整个项目的所有文件和依赖项。
PyInstaller 支持许多选项,以便你根据需要自定义打包过程。一些常用的选项包括:
打包选项:
导入选项:
打包配置选项:
调试选项:
优化选项:
其他选项:
这只是一些常用的PyInstaller参数,实际上有更多选项可用于更复杂的定制。你可以使用pyinstaller --help命令来查看完整的参数列表和说明。
例如,要生成一个单独的可执行文件并指定其名称,你可以使用以下命令:
pyinstaller -F -n my_app my_script.py
这将生成一个名为 my_app 的单独可执行文件。
当使用PyInstaller来打包Python应用程序时,你可以使用一系列重要的选项来设置依赖项和配置生成的可执行文件。以下是一些关键的依赖设置选项:
pyinstaller --hidden-import module_name script.py
pyinstaller --exclude-module module_name script.py
pyinstaller --add-binary "path/to/binary;destination/folder" script.py
pyinstaller --add-data "path/to/data;destination/folder" script.py
pyinstaller --paths path/to/modules script.py
你也可以手动👇👇
你可以使用以下命令导出项目的依赖项列表:
pyinstaller --name=my_app --onefile my_script.py --path=/path/to/dependencies
这将创建一个 my_app.spec 文件,其中包含了项目的依赖项列表。
编辑 my_app.spec 文件并添加依赖项的路径,如下所示:
# ... a = Analysis(['my_script.py'], pathex=['/path/to/project'], binaries=[], datas=[], ... pathex=['/path/to/dependencies'], # 添加依赖项路径 ... ) # ...
然后,使用以下命令来根据修改后的 my_app.spec 文件打包项目:
pyinstaller my_app.spec
这将使用指定的依赖项路径打包项目。
如果你需要更多的自定义选项,可以编辑 my_app.spec 文件并进行更详细的配置。你可以设置各种选项,包括文件和目录的排除和包含、运行时选项等。详细信息可以在 PyInstaller 的官方文档中找到。
成功打包后,你将在 dist 目录中找到生成的可执行文件。这个文件可以在没有安装 Python 解释器或其他依赖项的情况下在目标系统上运行。
打包如下程序:
(1)打开Anaconda Powershell Prompt,进入项目所在虚拟环境:
conda activate yt_dlp_env
(2)进入程序所在目录:
cd D:\Python_Study\VideoDownload
(3)打包:
pyinstaller -F --paths=E:\anaconda3\envs\yt_dlp_env\Lib\site-packages --python=E:\anaconda3\envs\yt_dlp_env\python.exe --icon=wx2.ico --name=Downloader DLP_GUI_Perfect.py
参数说明:
(3)在文件所在目录,打开dist文件夹,即可看到打包好的exe文件;
(4)直接打开即可运行,发送给别人也是如此(跨平台应该不行)。
打包好的exe程序运行时是会打开一个控制台窗口的,有时候是不需要的,比如你是一个GUI的程序。
在使用PyInstaller打包时,你可以使用--noconsole选项来告诉PyInstaller生成一个窗口应用程序而不是控制台应用程序:
pyinstaller -F --paths=E:\anaconda3\envs\yt_dlp_env\Lib\site-packages --python=E:\anaconda3\envs\yt_dlp_env\python.exe --noconsole --icon=wx2.ico --name=Downloader DLP_GUI_Perfect.py
但不建议第一次就这样打包,留着控制台,可以查看程序运行报错情况,因为依赖很多的情况下,可能存在依赖没完全指定的情况。
除了依赖问题,还有pyinstaller本身的问题,打包后,可能会改变一些程序的运行逻辑或者某个过程的编码、或者资源访问方式等等。不仅需要注意打包参数的设置,可能还需要修改源代码。
因此,需要多次调试才能打包好一个程序(复杂一些的),可以使用--debug参数打包,进行调试。