找回密码
 会员注册
查看: 18|回复: 0

Python程序打包PyInstaller详解

[复制链接]

1

主题

0

回帖

4

积分

新手上路

积分
4
发表于 2024-9-9 13:41:01 | 显示全部楼层 |阅读模式
Python程序打包PyInstaller详解PyInstaller是一个将Python程序及其依赖项打包成独立可执行文件的工具,适用于Windows、macOS和Linux。它通过分析你的代码来确定所需的模块,并将其包含在一个可执行文件中,这样你就可以在没有Python解释器的系统上运行你的程序。下面是使用PyInstaller将一个简单的Python脚本打包成可执行文件的步骤:第一步:安装PyInstaller首先,你需要确保PyInstaller已经安装在你的系统上。如果没有安装,可以通过pip来安装:pipinstallpyinstaller或者如果你使用的是Python3,可能需要使用pip3命令:pip3installpyinstaller第二步:准备你的Python脚本        假设你有一个名为my_script.py的Python脚本,位于你的工作目录中。这个脚本可以是任何有效的Python程序。第三步:创建.spec文件(可选)PyInstaller可以从命令行直接使用,但是为了更高级的配置,你可能需要创建一个.spec文件。这个文件允许你定制PyInstaller的行为,例如指定要包含的额外文件或模块。创建一个与你的脚本同名的.spec文件,例如my_script.spec,并编辑它以包含以下内容:#my_script.specblock_cipher=Nonea=Analysis(['my_script.py'],pathex=['/path/to/your/script'],#默认Bash当前目录binaries=[],datas=[],hiddenimports=[],hookspath=[],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='my_script',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,console=True)第四步:使用PyInstaller命令行工具最简单的方法是直接在命令行中使用PyInstaller。假设你的脚本位于当前目录下,你可以使用以下命令来生成可执行文件:pyinstaller--onefilemy_script.py这会将你的脚本打包成一个单独的可执行文件。--onefile参数告诉PyInstaller创建一个单一的可执行文件,而不是一个包含多个文件的文件夹。第五步:检查输出运行完PyInstaller后,你会在dist目录下找到你的可执行文件。对于Windows,它将是my_script.exe;对于macOS,它将是一个应用程序包;对于Linux,它将是一个可执行文件。第六步:测试你的可执行文件在分发之前,你应该在不同的系统上测试你的可执行文件,以确保它能够正常运行。第七步:解决依赖问题如果在测试时遇到任何问题,可能是由于缺少某些依赖模块。你可能需要在.spec文件中添加hiddenimports或者在命令行中使用--hidden-import参数来显式包含这些模块。以上就是使用PyInstaller打包Python脚本的基本流程。根据你的具体需求,可能还需要对.spec文件进行更详细的配置。注意事项1.PyInstaller打包需确保第三库及用到的资源导入a.第三库导入当你在Python脚本中使用了多个第三方库并且想要使用PyInstaller打包时,你可能需要在.spec文件中明确列出所有这些库中的隐藏导入,以确保它们都被正确地包含在最终的可执行文件中。下面是一个针对你提供的模块列表的示例.spec文件。这个.spec文件将会包括你提到的所有模块和库:#my_script.spec#和需要打包的py同名#Theblock_ciphervariableisnotusedinthiscase.block_cipher=None#DefinetheAnalysisobjectwithyourscriptandanyhiddenimports.a=Analysis(['my_script.py'],#需要打包的文件pathex=['/path/to/your/script'],#需要打包的文件路径binaries=[],datas=[],#需要用到的资料,如:图像、音频等非py的文件,都需要列出来hiddenimports=['tkinter','tkinter.filedialog','psd_tools','PIL.Image','psd_tools.PSDImage','PIL.ImageTk','sys','os','re','tkinter.ttk','time','pickle','tkinter.messagebox'],hookspath=[],runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False)#DefinethePYZobjectforthecompressedmoduledata.pyz=PYZ(a.pure,a.zipped_data,cipher=block_cipher)#DefinetheEXEobjecttocreatethefinalexecutable.exe=EXE(pyz,a.scripts,a.binaries,a.zipfiles,a.datas,name='my_script',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,console=True)但是请注意,hiddenimports列表中的模块名应该是那些在标准分析过程中不会被自动检测到的模块名。在大多数情况下,像tkinter,PIL这些常见的库会被自动检测到,除非它们使用了一些特殊的导入方式,比如延迟导入或动态导入。对于tkinter和PIL这样的库,通常不需要在hiddenimports中列出它们的标准模块,但它们的子模块可能需要。例如,PIL.ImageTk和tkinter.filedialog需要被明确列出。另外,你也可以使用PyInstaller的--hidden-import参数从命令行来指定这些隐藏导入,例如:pyinstaller--onefile--hidden-import=PIL.ImageTk--hidden-import=tkinter.filedialogmy_script.py这样可以避免修改.spec文件。但是,.spec文件提供了更多的灵活性和控制,特别是在处理更复杂的项目时。在实际应用中,你可能需要根据实际情况调整hiddenimports列表。如果在运行打包后的程序时遇到缺失模块的错误,那么就需要检查并添加相应的模块到hiddenimports中。如果你的主脚本依赖于其他的.py文件,比如Jswindow.py和JSNetwork.py,你需要确保PyInstaller也能识别并包含这些文件。通常,只要这些文件在你的主脚本的搜索路径中(通常是同一目录下),PyInstaller应该能自动检测到它们。但是,为了确保万无一失,你可以在.spec文件中显式地指出这些文件。你也可以通过添加datas或者binaries来包括任何非Python的数据文件或二进制文件,如果有的话。下面是一个修改后的.spec文件示例,其中包括了Jswindow.py和JSNetwork.py文件:#my_script.spec#Theblock_ciphervariableisnotusedinthiscase.block_cipher=None#DefinetheAnalysisobjectwithyourscriptandanyhiddenimports.a=Analysis(['my_script.py'],pathex=['/path/to/your/script'],binaries=[],datas=[('Jswindow.py','.'),('JSNetwork.py','.')],hiddenimports=['tkinter','tkinter.filedialog','psd_tools','PIL.Image','psd_tools.PSDImage','PIL.ImageTk','sys','os','re','tkinter.ttk','time','pickle','tkinter.messagebox'],hookspath=[],runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False)#DefinethePYZobjectforthecompressedmoduledata.pyz=PYZ(a.pure,a.zipped_data,cipher=block_cipher)#DefinetheEXEobjecttocreatethefinalexecutable.exe=EXE(pyz,a.scripts,a.binaries+a.collect_data,a.zipfiles,a.datas,name='my_script',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,console=True)在datas列表中,('Jswindow.py','.')和('JSNetwork.py','.')表示将Jswindow.py和JSNetwork.py文件包含在最终的输出中,它们会被放置在与可执行文件相同的目录下。然而,对于.py文件,通常不需要将它们添加到datas中,因为它们会被当作Python模块处理。datas主要用于包含数据文件,如图像、配置文件等。如果你的Jswindow.py和JSNetwork.py是作为模块被导入的,那么只需要确保它们在正确的路径下即可。如果你的Jswindow.py和JSNetwork.py文件中有额外的依赖或需要包含的资源,你可能还需要在hiddenimports或datas中添加相应的条目。另外,你也可以通过命令行参数来包含额外的文件或模块,例如:pyinstaller--onefile--additional-hooks-dir=path/to/hooksmy_script.pyb.应用资源文件导入默认情况下PyInstaller不会收集所有的非Python资源文件,包括像.ico这样的图标文件。为了确保图标文件也被包含在打包的可执行文件中,你需要告诉PyInstaller明确地包含这些文件。你可以在.spec文件中添加datas参数来实现这一点。datas参数允许你指定额外的数据文件及其目标位置。下面是如何在.spec文件中使用datas参数的例子:a=Analysis(['your_script.py'],pathex=['/path/to/your/script'],binaries=[],datas=[('favicon.ico','.')],#这里添加你的图标文件...)pyz=PYZ(a.pure,a.zipped_data,cipher=block_cipher)exe=EXE(pyz,a.scripts,a.binaries,a.zipfiles,a.datas,name='YourAppName',debug=False,strip=False,upx=True,console=False,#不显示控制台窗口icon='favicon.ico',#同时在这里指定图标文件...)在这个例子中,datas=[('favicon.ico','.')]表示favicon.ico文件应该被包含在最终的可执行文件中,并且它会被放置在可执行文件的根目录下。然后在EXE对象中再次指定图标文件,这样它就会被正确地嵌入到可执行文件中。另外,如果你在使用PyInstaller的命令行版本,你可以使用--additional-hooks-dir参数指向一个包含自定义钩子脚本的目录,在这个目录中的钩子脚本可以用来告诉PyInstaller如何处理特定类型的文件。但是,对于简单的图标文件,使用.spec文件中的datas参数通常就足够了。2.执行文件在运行时关闭控制台窗口在使用PyInstaller打包Python脚本时,如果你不希望生成的可执行文件在运行时显示命令行窗口(控制台窗口),特别是在Windows平台上,你可以通过设置console参数为False来实现。在你的.spec文件中,找到exe的定义部分,将console设置为False。这将告诉PyInstaller生成一个没有控制台窗口的GUI应用程序。以下是一个示例:#my_script.spec#...#DefinetheEXEobjecttocreatethefinalexecutable.exe=EXE(pyz,a.scripts,a.binaries+a.collect_data,a.zipfiles,a.datas,name='my_script',debug=False,bootloader_ignore_signals=False,strip=False,upx=True,console=False)#SetconsoletoFalsefornoconsolewindowonWindows3.图标:指定打包后的exe图标要在使用PyInstaller打包的程序中添加自定义图标,你需要遵循以下几个步骤:1.准备图标文件首先,确保你有一个.ico图标文件。这个图标将会被嵌入到你的可执行文件中,当你在文件资源管理器中查看该文件时,它将显示你选择的图标。2.修改.spec文件在你的.spec文件中,你需要添加一个icon属性来引用你的图标文件。假设你的图标文件叫做my_icon.ico,并且它位于与你的.spec文件相同的目录下,你可以在EXE对象中添加icon参数,如下所示:exe=EXE(...,icon='my_icon.ico',...)3.使用命令行参数:.spec文件,你可以在运行PyInstaller命令时添加--icon参数,后面跟上你的图标文件路径。例如:pyinstaller--onefile--windowed--icon=my_icon.icomy_script.py这个命令会创建一个单文件的可执行程序,并且在其中嵌入了你指定的图标4.确保图标文件的兼容性请确保你的图标文件是Windows兼容的格式,通常这意味着它应该是一个.ico文件,且包含不同尺寸的图标以便在不同的设备和DPI设置下显示良好。5.测试在打包完成后,运行生成的可执行文件并检查是否正确显示了你选择的图标。请注意,如果你在打包多平台的应用程序,.ico文件是Windows特定的格式。对于macOS和Linux,你可能需要提供其他格式的图标,如.icns(macOS)或.png(Linux)。然而,PyInstaller目前仅支持在Windows上嵌入图标,其他平台上的图标可能需要在应用程序内部处理。如果你的应用程序在多个平台上运行,并且你想要统一外观,可以考虑在应用程序的初始化代码中加载并设置图标。这通常涉及在你的主窗口或主应用实例上设置图标属性。4..spec文件的参数应用当你使用pyinstaller命令时,如果不带任何关于.spec文件的参数,PyInstaller会自动生成一个默认的.spec文件并基于此文件构建你的应用。这意味着你之前手动修改的.spec文件将不会被使用,而是会被覆盖。要确保使用你修改过的.spec文件,你应该在运行pyinstaller命令时明确指定该文件。这可以通过在命令行中加入.spec文件的路径来完成。例如,如果修改过的.spec文件叫做composer1.7.spec并且位于当前工作目录下,你应该使用以下命令:pyinstallercomposer1.7.spec或者如果.spec文件位于其他目录中,你需要提供完整的路径:pyinstaller/path/to/composer1.7.spec这样,PyInstaller将会读取你指定的.spec文件,并根据其中的配置构建你的应用程序。确保.spec文件中包含了正确的配置,比如我们之前讨论的datas参数,以便正确地包含图标文件和其他必要的资源。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 05:39 , Processed in 0.434335 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表