Python打包的exe运行后有两个进程的原因及解决方法

在使用Python开发桌面应用程序时,我们经常会使用打包工具将Python代码打包成可执行文件(exe)来方便用户使用。然而,有时候我们会发现,运行这些打包后的exe文件时,会出现两个进程的情况,这让人感到疑惑。本文将解释这个现象的原因,并介绍一种常见的解决方法。

问题背景

在使用PyInstaller等工具将Python代码打包成exe文件后,我们可以将该可执行文件运行在Windows系统中,这样用户无需安装Python解释器和依赖包,即可直接运行我们的应用程序。然而,当我们运行这个打包后的exe文件时,我们会发现在任务管理器中会出现两个进程,这让人感到困惑。

问题原因

这个现象的原因是因为PyInstaller等工具在打包过程中会将Python解释器和我们的应用程序打包成一个整体。当我们运行这个打包后的exe文件时,实际上是启动了两个进程,一个是Python解释器进程,另一个是我们的应用程序进程。

问题的解决

解决这个问题的方法是通过修改PyInstaller的配置文件,让打包后的exe文件只启动一个进程。下面是一个示例代码:

# main.py

if __name__ == '__main__':
    # 在此处写上你的应用程序代码
    pass

在使用PyInstaller打包时,我们可以通过修改配置文件来控制打包后的exe文件的行为。创建一个名为spec_file.spec的配置文件,并将以下内容添加到该文件中:

# spec_file.spec

# 导入必要的模块
import os
from PyInstaller.utils.hooks import collect_data_files

# 以下是PyInstaller的配置项
a = Analysis(['main.py'],
             pathex=['path/to/your/python/script'],
             binaries=[],
             datas=collect_data_files('path/to/your/python/script'),
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)

# 修改PyInstaller的配置项
a.datas += [('path/to/your/python/script/main.py', 'main.py', 'DATA')]
a.scripts = [Executable('main.py',
                        targetName='your_exe_file_name.exe',
                        base='Win32GUI',
                        )]
a.name = 'your_exe_file_name'
a.version = '1.0'
a.description = 'Your application description'

# 保存修改后的配置项
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(pyz, a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='your_exe_file_name',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=False,
          disable_windowed_traceback=False,
          target_arch=None,
          codesign_identity=None,
          entitlements_file=None,
          )

# 删除不必要的exe文件
os.remove('your_exe_file_name.exe')

在这个配置文件中,我们修改了a.scripts的值,将base设置为Win32GUI。这样一来,在运行打包后的exe文件时,就不会启动Python解释器进程了,只会启动我们的应用程序进程。

整体流程

下面是一个使用PyInstaller打包Python代码为exe文件的整体流程的流程图表示:

flowchart TD
    A[编写Python代码] --> B[创建spec文件]
    B --> C[修改spec文件]
    C --> D[使用PyInstaller打包]
    D --> E[生成exe文件]
    E --> F[运行exe文件]

总结

本文介绍了Python打包成exe文件后出现两个进程的原因,以及解决这个问题的方法。通过修改PyInstaller的配置文件,我们可以让打包后的exe文件只启动一个进程,提高应用程序的性能和用户体验。希望本文对你理解和解决这个问题有所帮助。