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

将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中,我们可以使用index()函数来查找列表中元素的位置。index()函数中第一个匹配元素的索引值。如果列表中没有找到匹配元素,则会抛出ValueError异常。 示例1:查找列表元素的位置 假设我们有一个名为my_list的列表,其中包含数…

    python 2023年5月13日
    00
  • Python如何读取、写入JSON数据

    下面就给您详细讲解一下Python如何读取、写入JSON数据。 什么是JSON数据? JSON,全称 JavaScript Object Notation,是一种轻量级的数据交换格式,通常用于Web程序中将数据从服务器传输到客户端。JSON格式的数据由键值对构成,类似于Python中的字典类型。值可以是数字、字符串、布尔、列表、字典和null。 以下是一个J…

    python 2023年5月20日
    00
  • 使用Numpy和Matplotlib绘制正态分布图

    好的。首先,我们需要简单介绍一下Numpy和Matplotlib这两个库。 Numpy NumPy(Numerical Python)是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,同时也针对数组运算提供大量的数学函数库。这是 Python 语言的开源软件之一,也是数据分析、数据处理和科学计算等领域最常用的库之一。 Matplotlib…

    python-answer 2023年3月25日
    00
  • Python实战之实现截图识别文字

    Python实战之实现截图识别文字的完整攻略 在实际应用中,我们经常需要从截图中提取文字信息。Python提供了多种库和工具,可以帮助我们实现截图识别文字的功能。以下是实现截图识别文字的完整攻略: 安装Tesseract OCR Tesseract OCR是一个开源的OCR引擎,可以识别多种语言的文字。在使用Python实现截图识别文字之前,我们需要先安装T…

    python 2023年5月14日
    00
  • python输出带颜色字体实例方法

    让我来详细讲解一下“python输出带颜色字体实例方法”的完整攻略吧。 1. 简介 在Python中,我们可以使用ANSI Escape Code来输出带颜色的字体。ANSI Escape Code是一些控制字符,可以用来在终端中控制文本的颜色、样式等属性。我们可以利用这些控制字符,来让Python输出带颜色的字体。 2. 实现方法 下面是Python输出带…

    python 2023年6月5日
    00
  • Python自动扫雷实现方法

    下面是“Python自动扫雷实现方法”的完整攻略。 1. 确定游戏规则和界面 在实现自动扫雷之前,首先需要了解扫雷游戏的规则和界面,这样才能编写出相应的程序进行模拟和操作。一般来说,扫雷游戏的界面可以分为两部分:一是雷区,即扫雷游戏的主要操作区域,包含若干个方块;二是信息区,即游戏状态的显示区域,包含踩中地雷的次数、剩余地雷数、用时等。 需要实现自动扫雷的话…

    python 2023年5月19日
    00
  • 如何使用Python从数据库中获取BLOB类型的数据并将其保存到本地文件中?

    以下是如何使用Python从数据库中获取BLOB类型的数据并将其保存到本地文件中的完整使用攻略。 使用Python从数据库中获取BLOB类型的数据并将其保存到本地文件中的前提条件 在Python中从数据库获取BLOB类型的数据并将其保存到本地文件中前,需要保已经安装并启动支持数据的,例如MySQL或PostgreSQL,并且需要安装Python的相数据库驱动…

    python 2023年5月12日
    00
  • Python学习之运算符号

    Python学习之运算符号 算术运算符 Python中的算术运算符有加法、减法、乘法、除法、取余、取整和幂运算,分别对应符号 +、-、*、/、%、// 和 **。 示例: a = 10 b = 3 print(a + b) # 输出 13 print(a – b) # 输出 7 print(a * b) # 输出 30 print(a / b) # 输出 3…

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