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 osdef resource_path(relative_path):"""获取资源文件的绝对路径"""try:base_path = sys._MEIPASSexcept 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 function1def 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 环境的机器上直接运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/64881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity中的委托和事件(UnityAction、UnityEvent)

委托和事件 🎒什么是委托,委托的关键字是Delegate,委托是一种函数的容器,运行将函数做为变量来进行传递 通过Delegate关键字我们声明了一个无参无返回的委托,通过这个委托我们可以存储无参无返回的函数 public deleg…

sh cmake-linux.sh -- --skip-license --prefix = $MY_INSTALL_DIR

本文来自天工AI --------- 命令用于安装CMake的脚本,其中--skip-license参数表示跳过许可协议的显示,--prefix参数指定了CMake的安装目录。$MYINSTALLDIR是一个环境变量,应该在运行命令之前设置为您想要安装CMake的目录。 -------- sh xx…

面试真题 | 金山 C++ [20241218]

文章目录 @[toc]1.c++程序的内存分布C++程序的内存分布面试官的追问及回答2.堆和栈的区别堆和栈的区别1. 管理方式2. 内存分配和释放3. 内存大小和生命周期4. 访问权限面试官的追问及回答3.内存泄漏怎么办内存泄漏的处理方法面试官的追问及回答4.智能指针,哪几种智能指针及其种…

呼入机器人:24小时客户服务的未来趋势

呼入机器人:24小时客户服务的未来趋势 作者:开源大模型智能呼叫中心系统FreeAICC,Github:https://github.com/FreeIPCC/FreeAICC 在当今快节奏的商业环境中,客户服务已成为企业竞争的核心要素之一。随着人工智能技术…

使用计算机创建一个虚拟世界

创建一个虚拟世界是一项复杂而多方面的工作,它涉及多个领域的知识,包括计算机图形学、编程、物理模拟、声音设计、艺术设计等。以下是创建虚拟世界的基本步骤和工具建议: 1. 确定虚拟世界的目标和范围 目标:明确这个虚拟世界的用…

uniapp v-tabs修改了几项功能,根据自己需求自己改

根据自己的需求都可以改 这里写自定义目录标题 1.数组中的名字过长,导致滑动异常2.change 事件拿不到当前点击的数据,通过index在原数组中查找得到所需要的id 各种字段麻烦3.添加指定下标下新加红点显示样式 1.数组中的名字过长,导致滑动异常…

CAD xy坐标标注(跟随鼠标位置实时移动)——C#插件实现

效果如下: (使用方法:命令行输入 “netload” 加载此dll插件,然后输入“zbbz”运行,选择文件夹即可。支持字体大小变化,输入“zbbd”可设置坐标字体变大或缩小的倍数) 部分代码如下:…

vue项目中使用ag-grid

我这个项目中使用原因: 支持大数据量数据,滑动页面不会有白屏现象可对当前列表中数据进行过滤 安装依赖 ag-grid-vueag-grid-community 我这里使用的社区版ag-grid-community/locale 中文配置依赖 main.js import "ag-grid-community/styles/ag-gr…

【C#】实现Json转Lua (Json2Lua)

关键词: C#、JsonToLua、Json2Lua、对象序列化Lua 前提需引入NewtonsofJson,引入方法可先在Visual Studio 2019 将Newtonsoft.Json.dll文件导入Unity的Plugins下。 Json格式字符串转Lua格式字符串,效果如下: json字符串 {"1": &q…

Redis 7.x如何安装与配置?保姆级教程

大家好,我是袁庭新。最新写了一套最新版的Redis 7.x企业级开发教程,今天先给大家介绍下Redis 7.x如何在Linux系统上安装和配置。 1 Redis下载与安装 使用非关系型数据库Redis必须先进行安装配置并开启Redis服务,然后使用对应客户端连接使用…

Redis篇--常见问题篇6--缓存一致性1(Mysql和Redis缓存一致,更新数据库删除缓存策略)

1、概述 在使用Redis作为MySQL的缓存层时,缓存一致性问题是指Redis中的缓存数据与MySQL数据库中的实际数据不一致的情况。这可能会导致读取到过期或错误的数据,从而影响系统的正确性和用户体验。 为了减轻数据库的压力,通常读操作都是先读缓…

代码加入SFTP JAVA ---(小白篇3)

在 Java 中,您可以使用 JSch(Java Secure Channel)库 来连接和操作 SFTP 服务器。以下是一个完整的示例代码,展示如何使用 Java 接入 SFTP 服务器并上传文件。 1.服务器上加入SFTP------(小白篇 1) 2.加入SFTP 用户------(小白篇…

leetcode之hot100---240搜索二维矩阵II(C++)

思路一:通过遍历主对角线上元素判断查找方向 主对角线遍历: 遍历主对角线上的每个元素(matrix[i][i]),其中 i 的范围是 [0, min(m, n) - 1]。如果目标值小于当前主对角线元素,说明目标值可能在当前元素的左…

【Nginx-4】Nginx负载均衡策略详解

在现代Web应用中,随着用户访问量的增加,单台服务器往往难以承受巨大的流量压力。为了解决这一问题,负载均衡技术应运而生。Nginx作为一款高性能的Web服务器和反向代理服务器,提供了多种负载均衡策略,能够有效地将请求分…

git remote -v(--verbose)显示你的 Git 仓库配置的远程仓库的详细信息

git remote -v 是一个 Git 命令,用于显示你的 Git 仓库配置的远程仓库的详细信息。 当你执行 git remote -v 命令时,你会看到类似以下的输出: origin https://github.com/your-username/your-repo.git (fetch) origin https://github.com…

《Java 与 Deeplearning4j:开启深度学习高效训练之旅》

在当今科技飞速发展的时代,深度学习无疑是人工智能领域的一颗璀璨明珠。Java 作为一种广泛应用的编程语言,与 Deeplearning4j 框架的结合,为开发者们开辟了一条在深度学习领域大展身手的新路径。那么,如何在 Java 中高效地使用 De…

MySQL 基础:开启数据库之旅

MySQL 基础:开启数据库之旅 在当今数字化的时代,数据扮演着至关重要的角色,而数据库管理系统则是存储、管理和操作这些数据的强大工具。MySQL 作为一款广受欢迎的开源关系型数据库管理系统,被广泛应用于各类网站、应用程序以及企业…

递归读取指定目录下的文件

序言 需要读取sftp服务器上符合指定的文件名正则的文件列表&#xff0c;目前想到的最好的办法就是递归。 我这里引入的依赖是&#xff1a; <!-- jsch-sftp连接 --><dependency><groupId>com.jcraft</groupId><artifactId>jsch</artif…

<代码随想录> 算法训练营-2024.12.21

今日专题 &#xff1a;动态规划、打家劫舍 总结&#xff1a; 198. 打家劫舍 class Solution:def rob(self, nums: List[int]) -> int:#dp[n]max(dp[n-1],dp[n-2]nums[n])sizelen(nums)if size1:return nums[0]#n的状态只依赖n-1和n-2的状态&#xff0c;对状态进行压缩i,j…

uniapp 将base64字符串保存为图片、Word、Excel、音频、视频等文件

function blobToBase64(blob) {return new Promise((resolve, reject) > {const reader new FileReader();reader.onerror reject;reader.onload () > {if (typeof reader.result string) {// 去掉"data:..."前缀&#xff0c;只保留 Base64 部分resolve(re…