详解将Python程序(.py)转换为Windows可执行文件(.exe)

yizhihongxing

将Python程序转换为Windows可执行文件(.exe)可以实现在没有Python环境的Windows计算机上运行程序。下面是一个完整的攻略。

1. 安装pyinstaller

pyinstaller是一个用于将Python程序转换为独立可执行文件的工具。使用pip可以轻松安装pyinstaller,只需在命令行中运行以下命令:

pip install pyinstaller

2. 创建spec文件

使用pyinstaller需要首先创建一个spec文件,该文件包含如何打包Python程序的详细说明。在命令行中,进入Python程序所在目录并运行以下命令:

pyinstaller --name=程序名称 --onefile 程序名称.py
  • --name 选项用于指定生成的可执行文件的名称。
  • --onefile 选项用于生成单个可执行文件。

执行完上述命令后,会在当前目录下生成一个.spec文件,该文件包含打包Python程序的详细说明。

3. 修改spec文件

打开.spec文件,在其最后添加以下代码:

import os
import sys
from PyInstaller.utils.hooks import collect_data_files

basepath = os.path.abspath(os.path.dirname(__file__))
datas = collect_data_files("matplotlib")
for data in datas:
    dirname, filename = os.path.split(data[1])
    if dirname.startswith("matplotlib"):
        dirname = os.path.join("_MEIPASS", "mpl-data", dirname)
    else:
        dirname = os.path.join("_MEIPASS", dirname)
    datas.append((os.path.join(basepath, data[0]), os.path.join(dirname, filename)))

这段代码用于处理matplotlib库的问题。如果程序中用到了matplotlib库,就必须加入这段代码。

4. 执行打包命令

在命令行中,进入.spec文件所在目录,并执行以下命令:

pyinstaller --name=程序名称 --onefile 程序名称.spec

其中,--name选项用于指定生成的可执行文件的名称,--onefile选项用于生成单个可执行文件。

示例1:将hello.py转换为hello.exe

下面以将hello.py转换为hello.exe为示例,展示详细步骤。

  1. 首先在hello.py所在目录打开命令行窗口。

  2. 运行以下命令安装pyinstaller工具:

    pip install pyinstaller

  3. 在命令行中运行以下命令,生成.spec文件:

    pyinstaller --name=hello --onefile hello.py

  4. 打开.hello.spec文件,添加matplotlib库的处理代码,示例代码如下:

    ```python
    import os
    import sys
    from PyInstaller.utils.hooks import collect_data_files

    basepath = os.path.abspath(os.path.dirname(file))
    datas = collect_data_files("matplotlib")
    for data in datas:
    dirname, filename = os.path.split(data[1])
    if dirname.startswith("matplotlib"):
    dirname = os.path.join("_MEIPASS", "mpl-data", dirname)
    else:
    dirname = os.path.join("_MEIPASS", dirname)
    datas.append((os.path.join(basepath, data[0]), os.path.join(dirname, filename)))
    ```

  5. 在命令行中运行以下命令,生成hello.exe文件:

    pyinstaller --name=hello --onefile hello.spec

示例2:将包含GUI界面的Python程序转换为exe文件

以下示例将包含GUI界面的Python程序转换为exe文件。

  1. 首先在Python程序所在目录打开命令行窗口。

  2. 运行以下命令安装pyinstaller工具:

    pip install pyinstaller

  3. 在命令行中运行以下命令,生成.spec文件:

    pyinstaller --onefile 程序名称.py

  4. 在.spec文件中添加GUI相关代码,示例代码如下:

    ```python
    import os
    import sys

    if sys.platform == 'win32':
    try:
    import matplotlib
    # Matplotlib fix for pyinstaller
    MATPLOTLIBDATA = matplotlib.get_data_path()
    mpl_data = os.path.join(os.path.split(MATPLOTLIBDATA)[0], 'share', 'matplotlib')
    DATADIR = [
    (os.path.join(mpl_data, 'mpl-data'), 'mpl-data'),
    (os.path.join(mpl_data, 'matplotlibrc'), './')]
    except ImportError:
    print('Matplotlib not found, not adding to data files')
    DATADIR = []
    else:
    DATADIR = []

    topology = 0

    exe_path = sys.executable

    test_path = os.path.dirname(os.path.abspath(file))

    assets_path = os.path.join(test_path, "assets")

    try:
    import PySide2.QtCore
    topology = 2
    QT5VERSION = PySide2.QtCore.QT_VERSION_STR
    QT5PLUGIN = PySide2.file
    QT5FOLDER = os.path.normpath(os.path.join(QT5PLUGIN, "..", "plugins", "platforms"))

    CLASS_FILES = [
        (os.path.join(test_path, "resources"), "resources"),
        ("assets", "assets")
    ]
    
    DATA_FILES = [
        (QT5PLUGIN, "."),
        (os.path.join(QT5PLUGIN, "..", "Qt", "plugins", "platforms", "*"), "./platforms"),  # 方便替换
    ]
    
    # Rename the exe to a valid Python name that won't clash
    # This needs to be done because the PyInstaller spec file is in Python
    NEWEXENAME = "validexe.py"
    
    hidden_imports = ["pkg_resources.py2_warn"]
    

    except ImportError:
    pass

    (sources, target dir)

    coll = []

    for root, dirs, files in os.walk(os.path.join(test_path)):
    for f in files:
    if '.pyc' in f or '.pyo' in f:
    continue
    filename = os.path.join(root, f)
    targetdir = os.path.join(os.path.relpath(root, test_path))
    coll.append((filename, targetdir))

    a = Analysis(
    [os.path.join(test_path, 'main.py')],
    pathex=[test_path],
    binaries=None,
    datas=DATADIR + CLASS_FILES + coll + DATA_FILES,
    hiddenimports=[
    'pkg_resources.py2_warn'
    ],
    hookspath=[],
    runtime_hooks=[],
    excludes=[
    'numpy',
    'PySide2',
    ],
    win_no_prefer_redirects=False,
    win_private_assemblies=True,
    cipher=None,
    bootstrap=(),
    extra_pyz_stacks=[]
    )

    pyz = PYZ(a.pure, a.zipped_data,
    cipher=None)
    exe = EXE(pyz,
    a.scripts,
    a.binaries,
    a.zipfiles,
    a.datas,
    [],
    name='validexe.py',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    upx_include=[],
    console=False
    )

    coll_f = COLLECT(exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    [os.path.join(QT5FOLDER, "qwindows.dll"), (os.path.join(QT5FOLDER, "qminimal.dll")),
    os.path.join(QT5FOLDER, "qoffscreen.dll")],
    upx=True,
    upx_exclude=[],
    name='validexe.exe',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx_include=[],
    console=False)

    os.system('rd /S /Q build')

    app_folder = "build/exe.win-amd64-3.6"
    shutil.copytree(os.path.join(assets_path), os.path.join(app_folder, "assets"))

    if topology == 2:
    shutil.copytree(os.path.normpath(os.path.join(QT5PLUGIN, "..", "plugins", "platforms")), os.path.join(app_folder, "platforms"))
    else:
    print("Error - Unsupported topology")
    sys.exit(-1)
    ```

  5. 在命令行中运行以下命令,生成程序名称.exe文件:

    pyinstaller --onefile 程序名称.spec

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解将Python程序(.py)转换为Windows可执行文件(.exe) - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • python如何写出表白程序

    下面是Python写表白程序的完整攻略: 1. 准备工作 在写代码前,需要先确认电脑安装了Python环境。如果没有安装,可以在Python官网下载对应版本的安装程序进行安装。 2. 编写代码 2.1 示例一 下面是一个简单的示例,展示了如何用Python实现“我爱你”的效果: import time def say_love(words): for wor…

    python 2023年5月30日
    00
  • python笔试题(附带答案)

    下面是关于“python笔试题(附带答案)”的详细攻略。 1. 确认题目类型 在开始答题之前,先要确认题目类型。一般来说,Python笔试题可以分为以下几类: 纯理论题型。例如Python语法、数据类型、操作符、类、模块等内容的基础理论知识考查。 综合实战题型。例如读取文件、处理数据、网络编程、爬虫等综合应用实战题目。 编码题型。在规定时间内完成一定的编程任…

    python 2023年5月13日
    00
  • Python将一个Excel拆分为多个Excel

    下面是Python将一个Excel拆分为多个Excel的完整实例教程: 1. 准备工作 首先,你需要安装pandas库,它是一个数据分析库,可以方便地读取、操作和保存Excel文件。可以通过以下命令进行安装: pip install pandas 2. 读取Excel文件 我们先使用pandas库中的read_excel函数读取一个Excel文件,并将其转换…

    python 2023年5月13日
    00
  • Python工具箱系列(三十一)

    Neo4j是一个高性能的开源的,使用Java语言实现的NoSQL图数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。现实中很多数据都是用图来表达的,比如社交…

    python 2023年5月11日
    00
  • Python中list列表的一些进阶使用方法介绍

    Python中list列表的一些进阶使用方法介绍 在Python中,列表(List)是一种有序的集合,可以存储任意类型的数据,包数字、字符串、甚至是其他列表。除了基的创建、访问、添加、删除、排序等操作,文将介绍Python中list列表的一些进阶使用方法,包括列表推导式、片、zip()函数等,并提供两个实例。 列表推导式 列表推导式是一种简洁的创建列表的方式…

    python 2023年5月13日
    00
  • Python/MySQL实现Excel文件自动处理数据功能

    下面就为您详细讲解Python/MySQL实现Excel文件自动处理数据功能的完整实例教程。 确定需求 我们要实现的功能是读取Excel文件中的数据,将其存储到MySQL数据库中,并对数据进行统计分析。因此,需要用到xlrd和pymysql这两个Python库。 安装依赖库 在开始之前,需要确保已经安装了xlrd和pymysql这两个依赖库。可以通过下面的命…

    python 2023年5月13日
    00
  • python 判断字符串当中是否包含字符(str.contain)

    在 Python 中,我们可以使用字符串的 str.contains() 方法来判断一个字符串是否包含另一个字符串。这个方法返回一个布尔值,表示目标字符串是否包含指定的子字符串。下面将详细讲解 Python 中 str.contains() 方法的用法。 1. 判断单个字符串是否包含指定子字符串 我们可以使用 str.contains() 方法来判断一个字符…

    python 2023年5月14日
    00
  • Python中logger日志模块详解

    Python中logger日志模块详解 1. 为什么需要日志模块? 在编写代码时,有时候需要打印一些调试信息或者输出一些运行结果,以便于程序员进行调试和定位错误。在小规模的项目中,可以直接使用print函数进行输出。但是,在大规模的项目中,使用print容易造成输出信息泛滥,难以定位问题。此时,就需要使用专业的日志模块来管理输出信息。 Python标准库内置…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部