【Python】conda虚拟环境下使用pyinstaller打包程序为exe

news2024/10/11 16:29:45

文章目录

  • 一、为什么要用conda虚拟环境
  • 二、pyinstaller用法
    • 2.1 安装 PyInstaller
    • 2.2 基本用法
      • 打包一个 Python 脚本
      • 2.21 打包一个 Python 项目
      • 2.22 打包选项
    • 2.3 打包依赖项
      • 2.31 导出依赖项列表
      • 2.32 配置依赖项
    • 2.4 自定义打包选项
    • 2.5 打包完成后的文件
    • 2.6 注意事项
  • 三、打包示例

一、为什么要用conda虚拟环境

第一点是,pyinstaller打包需要指定程序中使用的库的路径,新手在这一点上很容易出现问题,导致打包后的exe程序执行的时候显示缺少模块。这个问题可能并不能通过简单地指定路径来解决。

第二点就是使用虚拟环境本身的好处了:

  • 可以创建多个不同的Python环境,每个环境可以安装不同版本的Python和不同的包,避免了包之间的冲突和依赖问题。
  • 可以方便地切换和管理不同的Python环境,只需要使用activate和deactivate命令即可。
  • 可以使用conda命令来安装和更新包,不需要使用pip或其他工具。conda还可以安装一些非Python的包,比如gcc,nodejs,cuda等。
  • 可以使用conda-forge等第三方源来获取更多的包,或者使用自定义的源来安装私有的包。
  • 可以使用conda export和conda env create命令来导出和导入环境配置文件,方便在不同的机器上复制相同的环境。

当你进入一个conda虚拟环境后(conda activate xxx),可以使用conda installpip install安装不同的包,因为某些包可能在conda源中没有。

虚拟环境的创建和使用很简单,不是本文的主题,这里不赘述了。

二、pyinstaller用法

PyInstaller 是一个用于将 Python 程序打包成可执行文件的强大工具。它允许你将你的 Python 代码、依赖项和解释器一起打包成一个独立的可执行文件,无需用户安装 Python 或其他依赖项。

2.1 安装 PyInstaller

首先进入项目所在的虚拟环境:

打开Anaconda Powershell Prompt(为什么不直接用Powershell?可以,但不建议,你可以从我本专栏前面的文章找到答案),进入项目所在虚拟环境:

conda activate yt_dlp_env

安装pyinstaller:

conda install pyinstaller

在这里插入图片描述

现在,先看第三节:实际使用示例,然后再回来看第二节。

2.2 基本用法

打包一个 Python 脚本

假设你有一个名为 my_script.py 的 Python 脚本,想将其打包成可执行文件。你可以在命令行中执行以下命令:

pyinstaller my_script.py

这将在当前目录下创建一个 dist 文件夹,其中包含了可执行文件。你可以在 dist 文件夹中找到 my_script(或 my_script.exe,取决于你的操作系统)可执行文件。

2.21 打包一个 Python 项目

如果你的项目包含多个文件,你可以将整个项目目录作为参数传递给 PyInstaller。例如:

pyinstaller my_project_directory

这将在 dist 文件夹中创建一个可执行文件,其中包含了整个项目的所有文件和依赖项。

2.22 打包选项

PyInstaller 支持许多选项,以便你根据需要自定义打包过程。一些常用的选项包括:

  1. 打包选项:

    • -F--onefile生成单个可执行文件
    • -D--onedir:生成一个包含多个文件的目录。
    • -w--windowed:创建一个窗口应用程序,没有控制台窗口。
    • -c--console:创建一个带有控制台窗口的命令行应用程序。
    • -m--name:指定生成的可执行文件的名称。
    • --add-data:添加额外的数据文件到可执行文件中。
  2. 导入选项:

    • -p--paths添加搜索Python模块的路径
    • --hidden-import指定需要手动导入但不在源代码中明确导入的模块
  3. 打包配置选项:

    • --name指定生成的可执行文件的名称
    • --icon指定可执行文件的图标文件
    • --version-file:指定版本信息文件。
    • --upx-dir:指定UPX可执行文件压缩工具的目录。
  4. 调试选项:

    • --debug生成带有调试信息的可执行文件
  5. 优化选项:

    • -O--optimize:使用优化编译Python文件。
    • --noconfirm:禁用优化编译确认提示。
  6. 其他选项:

    • -h--help:显示帮助信息。
    • --clean:清理临时文件。
    • --noconfirm:在覆盖现有输出目录时不进行确认。
    • --noconsole:不显示控制台
    • --python指定python解释器的路径

这只是一些常用的PyInstaller参数,实际上有更多选项可用于更复杂的定制。你可以使用pyinstaller --help命令来查看完整的参数列表和说明。

例如,要生成一个单独的可执行文件并指定其名称,你可以使用以下命令:

pyinstaller -F -n my_app my_script.py

这将生成一个名为 my_app 的单独可执行文件。

2.3 打包依赖项

当使用PyInstaller来打包Python应用程序时,你可以使用一系列重要的选项来设置依赖项和配置生成的可执行文件。以下是一些关键的依赖设置选项:

  1. --hidden-import:通过该选项,你可以指定需要手动导入但不在源代码中明确导入的模块。这对于确保PyInstaller能够识别和包含所有依赖项非常有用。
pyinstaller --hidden-import module_name script.py
  1. --exclude-module:使用该选项可以排除特定模块,不包含在生成的可执行文件中。
pyinstaller --exclude-module module_name script.py
  1. --add-binary:允许将外部二进制文件添加到生成的可执行文件中,这对于包含一些外部库非常有用。
pyinstaller --add-binary "path/to/binary;destination/folder" script.py
  1. --add-data:类似于--add-binary,但用于添加外部数据文件到生成的可执行文件中。
pyinstaller --add-data "path/to/data;destination/folder" script.py
  1. --paths:通过指定额外的模块搜索路径,可以确保PyInstaller能够找到依赖项的位置。
pyinstaller --paths path/to/modules script.py

你也可以手动👇👇

2.31 导出依赖项列表

你可以使用以下命令导出项目的依赖项列表:

pyinstaller --name=my_app --onefile my_script.py --path=/path/to/dependencies

这将创建一个 my_app.spec 文件,其中包含了项目的依赖项列表。

2.32 配置依赖项

编辑 my_app.spec 文件并添加依赖项的路径,如下所示:

# ...
a = Analysis(['my_script.py'],
             pathex=['/path/to/project'],
             binaries=[],
             datas=[],
             ...
             pathex=['/path/to/dependencies'],  # 添加依赖项路径
             ...
             )
# ...

然后,使用以下命令来根据修改后的 my_app.spec 文件打包项目:

pyinstaller my_app.spec

这将使用指定的依赖项路径打包项目。

2.4 自定义打包选项

如果你需要更多的自定义选项,可以编辑 my_app.spec 文件并进行更详细的配置。你可以设置各种选项,包括文件和目录的排除和包含、运行时选项等。详细信息可以在 PyInstaller 的官方文档中找到。

2.5 打包完成后的文件

成功打包后,你将在 dist 目录中找到生成的可执行文件。这个文件可以在没有安装 Python 解释器或其他依赖项的情况下在目标系统上运行。

2.6 注意事项

  • 打包大小:可执行文件的大小可能会比原始 Python 代码大很多,因为它包含了 Python 解释器和依赖项。你可以通过精简依赖项来减小可执行文件的大小。
  • 跨平台问题:PyInstaller 支持在不同的操作系统上打包应用程序,但需要在相应的操作系统上运行 PyInstaller。

三、打包示例

打包如下程序:
在这里插入图片描述


(1)打开Anaconda Powershell Prompt,进入项目所在虚拟环境:

conda activate yt_dlp_env

(2)进入程序所在目录:

cd D:\Python_Study\VideoDownload

(3)打包:

pyinstaller -F --paths=E:\anaconda3\envs\yt_dlp_env\Lib\site-packages --python=E:\anaconda3\envs\yt_dlp_env\python.exe    --icon=wx2.ico --name=Downloader DLP_GUI_Perfect.py

参数说明:

  1. -F:打包成一个可执行文件;
  2. -- path:指定python模块的搜索路径;
  3. --python:指定python解释器路径;
  4. --icon:可执行文件的图标
  5. --name:可执行文件名称

(3)在文件所在目录,打开dist文件夹,即可看到打包好的exe文件;
在这里插入图片描述

在这里插入图片描述

(4)直接打开即可运行,发送给别人也是如此(跨平台应该不行)。

在这里插入图片描述


打包好的exe程序运行时是会打开一个控制台窗口的,有时候是不需要的,比如你是一个GUI的程序。

在使用PyInstaller打包时,你可以使用--noconsole选项来告诉PyInstaller生成一个窗口应用程序而不是控制台应用程序:

pyinstaller -F --paths=E:\anaconda3\envs\yt_dlp_env\Lib\site-packages --python=E:\anaconda3\envs\yt_dlp_env\python.exe  --noconsole  --icon=wx2.ico --name=Downloader DLP_GUI_Perfect.py

但不建议第一次就这样打包,留着控制台,可以查看程序运行报错情况,因为依赖很多的情况下,可能存在依赖没完全指定的情况。


除了依赖问题,还有pyinstaller本身的问题,打包后,可能会改变一些程序的运行逻辑或者某个过程的编码、或者资源访问方式等等。不仅需要注意打包参数的设置,可能还需要修改源代码

因此,需要多次调试才能打包好一个程序(复杂一些的),可以使用--debug参数打包,进行调试。

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

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

相关文章

RabbitMQ 知识点解读

1、AMQP 协议 1.1、AMQP 生产者的流转过程 当客户端与Broker 建立连接的时候,会调用factory .newConnection 方法,这个方法会进一步封装成Protocol Header 0-9-1 的报文头发送给Broker ,以此通知Broker 本次交互采用的是AMQPO-9-1 协议&…

文件上传漏洞案例

目录 1.案例一 1)案例源码 2)创建web.php文件 3)使用抓包软件 2.案例二 1)案例代码 2) 案例分析 3)copy命令生成图片马 4)上传图片马到服务器 5)解析 文件图片 3.案例三 …

Error running ‘xxx‘: Command line is too long. Shorten command line for xxxx

完整报错信息:Error running ArticleFreemarkerTest.test: Command line is too long. Shorten command line for ArticleFreemarkerTest.test or also for JUnit default configuration. 翻译为运行“ArticleFreemarkerTest.test”时出错,命令行太长。…

计网第四章(网络层)(八)

在第七节(计网第四章(网络层)(七)_永无魇足的博客-CSDN博客)我们总结了路由信息协议RIP。在最后我们提到了RIP协议有坏消息传的慢的问题,这是距离向量算法的本质决定的,所以这种问题…

成都青溪电商:抖店精选联盟怎么绑定?

随着抖音平台的快速发展,越来越多的商家希望利用抖音的流量红利来实现品牌曝光和销量增长。抖音精选联盟作为抖音平台的重要合作计划,为商家提供了更多的机会和资源支持。下面将详细介绍如何绑定抖店精选联盟并讨论解绑情况。 1.绑定抖店选定联盟 满足入…

蓝桥杯官网练习题(数字三角形)

题目描述 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。 路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外&a…

AlwaysUp10.5.0.93安装和使用说明

安装包 安装 解压 双击exe 点击完成,完成安装 安装完成自动启动程序

基于串口的BLE模组CC2640R2使用总结

之前写过蓝牙控制芯片nRF52832的一篇概述,里面主要记录了蓝牙的分层结构,需要的话可参考:nRF52832蓝牙概述_路溪非溪的博客-CSDN博客 这篇文章记录的是蓝牙模组的基本使用。 二者有何区别呢? nRF52832是一款基于蓝牙的主控芯片…

QUIC协议科普导入(一)

一:QUIC协议导入 QUIC是一个通用的传输层网络协议,最初由Google的Jim Roskind设计,2012年实现并部署,2013年随着实验范围的扩大而公开发布,并向IETF描述。虽然长期处于互联网草案阶段,但在从Chrome浏览器到…

【考研数学】高等数学第五模块 —— 级数(3,傅里叶级数)

系列文章 【考研数学】高等数学第五模块 —— 级数(1,常数项级数) 【考研数学】高等数学第五模块 —— 级数(2,幂级数) 文章目录 引言三、傅里叶级数3.1 周期为 2 π 2\pi 2π 的函数的傅里叶级数3.2 定…

VS Code输出窗口显示中文乱码的解决办法

今天用requests测试web接口, response的编码是utf-8,结果在输出窗口显示的中文乱码,查了很多资料,最终找了一个比较好解决方案 url "XXXXXX"payloadeid16331117402headers {User-Agent: Apifox/1.0.0 (https://apifox…

SpringBoot原理-自动配置-概述

自动配置 SpringBoot的自动配置就是当Spring容器启动后,一些配置类、bean对象就会自动存入IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。启动一个SpringBoot项目后,观察如下

CRM系统主要通过什么来提升销售业绩

我们常说的CRM就是客户关系管理系统,它可以收集、整理和分析客户数据,帮助企业深入了解客户,提高客户转化率。CRM还可以提供市场获客、线索分配、售后服务等功能。下面就来说说,CRM主要是干什么的? CRM主要是做以下几…

当所有行业都在数字化转型时,实体商家如何快速“破局”

当今世界,信息技术创新日新月异,数字化、网络化、智能化深入发展。 国家多次明确强调推进“数字中国”建设,持续促进数字技术和实体经济深度融合,协同推进数字产业化和产业数字化。 对于实体商家来说,数字化转型已经不…

Tomcat服务部署、优化及多实例实验(Nginx+Tomcat负载均衡、动静分离)

目录 1 Tomcat 1.1 tomcat 构成 1.2 什么是 servlet? 1.3 什么是 JSP? 1.4 Tomcat 功能组件结构 1.5 Container 结构分析 1.6 Tomcat 请求过程 2 Tomcat 服务部署 2.1 环境部署 2.1.1 ​编辑 2.1.2 设置JDK环境变量 2.2 安装启动Tomcat 2.3 优化tomca…

第4章_瑞萨MCU零基础入门系列教程之瑞萨 MCU 源码设计规范

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…

使用 FastChat 运行 CodeLlama-7b-Instruct-hf

使用 FastChat 运行 CodeLlama-7b-Instruct-hf 1. 确认 FactChat 支持的 Model2. 升级依赖3. 启动 controller4. 启动 CodeLlama5. 启动 api server6. VSCode 中使用 CodeLlama 1. 确认 FactChat 支持的 Model 访问 model_support.md,确认 codellama/CodeLlama-7b-…

浅谈电商平台API接口能做什么电商功能应用【以淘宝电商为例】

API接口我们很多行业都需要用到。作为电商从业者,更是对电商平台的各种API的功能和应用了如指掌!本文就以淘宝平台API接口,封装的商品详情,SKU等各类商品数据API接口为例,我们来看看API接口都能怎么应用,而…

SpringBoot自动配置原理及使用流程

SpringBoot自动配置原理及使用流程 SpringBoot自动配置原理 具体流程 1、导入场景 以starter-web为例 场景启动器导入了相关场景的所有依赖,如:starter-json,starter-tomcat,spring-webmvc。 每个场景启动器都引入了一个spring-boot-starter,核心场景…

【ROS 06】机器人系统仿真

对于ROS新手而言,可能会有疑问:学习机器人操作系统,实体机器人是必须的吗?答案是否定的,机器人一般价格不菲,为了降低机器人学习、调试成本,在ROS中提供了系统的机器人仿真实现,通过仿真&#x…