Python:使用PyInstaller打包

本文所讲仅为独立的项目文件夹下如何进行打包,不涉及存在依赖关系的多个文件夹共同打包。

项目结构示例

    D:/
	└── myproject
	    └── my_project
	        ├── main.py
	        ├── module1.py
	        └── other_files...
  • 项目文件夹:my_project
  • 主程序文件:main.py
  • 其他自定义模块:如module1.pymodule2.py
  • 其他资源文件(如图片、配置文件等):放在imagesconfigs文件夹中

一. 安装PyInstaller

在命令行中运行以下命令,安装软件包

pip install pyinstaller

二. 资源文件处理

在打包后的可执行文件中,资源文件的路径可能会发生变化。如果项目中有资源文件(如my_project/imagesmy_project/configs中的文件),为了确保在程序中正确引用这些资源文件的路径。
使用sys._MEIPASS(这是PyInstaller创建的一个临时文件夹路径,用于存放资源文件)来获取正确的路径。例如,在main.py中可以这样处理资源文件路径:

import sys
import os

def resource_path(relative_path):
    """获取资源文件的绝对路径"""
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

当引用资源文件(如图片文件image.jpgimages文件夹中)时,可以使用resource_path("images/image.jpg")来获取正确的路径。

三. 检查程序入口

在主程序文件(如main.py)中,应该包含程序的初始逻辑,例如:初始化窗口(如果是图形界面程序)、加载配置文件、启动主要的业务流程等。要确保程序的主要功能和流程是从这个文件开始触发的。如果有多个Python文件,其他文件中的函数和类应该是被主程序文件调用的。例如,main.py可能会导入module1.py中的函数并调用它们来实现具体的功能,例如:

from module1 import function1

def main():
    function1()
    # 其他主程序逻辑

if __name__ == "__main__":
    main()

这样,当打包后的可执行文件运行时,就会从main.pyif __name__ == "__main__"部分开始执行,调用main函数,进而调用其他模块中的函数来实现完整的程序功能。

三. 打包

(一)打包整个文件夹

在命令行中进入my_project文件夹的上级目录(示例中为D:/),然后运行:

pyinstaller -F -p my_project my_project/main.py`。
  • -F参数表示生成单个可执行文件。
  • -p参数用于指定Python模块搜索路径,这里将项目文件夹my_project添加到搜索路径中,这样PyInstaller才能找到所有相关的模块。
  • my_project/main.py指定了主程序文件的路径。

(二)打包单个py文件

如果只有一个py文件需要打包,可使用此方式直接打包。

方法一
在命令行中进入包含 Python 脚本的目录(示例中为D:/my_project),执行:

pyinstaller --onefile module1.py
  • --onefile表示将所有文件打包成一个独立的可执行文件。
  • module1.py是要打包的 Python 脚本文件名。

方法二
通过--distpath参数指定生成的可执行文件存放路径(不指定时,存放在py文件路径下)

pyinstaller --onefile --distpath D:/my_project module1.py

这样生成的可执行文件就会存放在D:/my_project文件夹中。

打包后会在dist文件夹中生成对应的可执行文件,可将其拷贝到其他无 Python 环境的机器上直接运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值