LinuxGod

LinuxGod.net
Linux大神网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

python打包exe工具Python打包工具的详细介绍

2023年10月20日 735点热度

python打包exe工具

Python打包工具主要有三种:py2exe、PyInstaller和cx_Freeze。其实是三种工具,并且实现打包的方法都是邯郸小异。无非将Python运行所需的基础dll文件和源码依赖的模块筛选后聚合在一起,进而达到脱离环境单独运行的目的。但其中比较新奇的是它们竟然可以将最终代码打包成单个文件去运行,简直不要太神奇。

清风常用的打包工具为pyinstaller,安装下载简单,网上的文档也很齐全。

打包的exe怎样执行

即便你们看见python打包exe工具的优势,还会提及一句打包成单个文件,可以保护源码不泄露。对于菜鸟来说linux 执行exe文件,这个理由完美,单个文件如何操作觉得也不会获得源码,但我只能说,天真啊!

pyinstaller的官方文档:

pyinstaller.readthedocs.io:HowtheOne-FileProgramWorks

中有相关内容的详尽说明,为了便捷,我简单翻译下:

引导加载程序也是单文件捆绑包的核心。启动后,它将在此操作系统的相应临时文件夹位置中创建一个临时文件夹。该文件夹名为_MEIxxxxxx其中xxxxxx是一个随机数。一个可执行文件包含脚本使用的所有Python模块的嵌入式归档,以及任何非Python支持文件(比如,.so文件)的压缩副本。引导加载程序解压缩支持文件linux find,并将副本写入临时文件夹。这可能须要一些时间。这就是为何单文件应用程序比单文件夹应用程序启动慢的诱因。

所以单个的exe文件在执行时,会先在系统临时目录下创建一个_MEI开头的文件夹,之后解压源码、依赖文件后,运行该临时文件夹下的内容。

执行文件linux命令_执行文件linux_linux 执行exe文件

其中windows的临时文件夹一般为:

C:WindowsTemp_MEIxxxx或

C:Users用户名AppDataLocalTemp_MEIxxxx

但经过多次测试,几乎全在前者的目录下。似乎只要在cmd下输入echo%temp%或则%tmp%才能确定了...

windwos临时目录

Linux的临时文件夹目录自然是在:

**/tmp/_MEIxxxxx**

执行文件linux_linux 执行exe文件_执行文件linux命令

其实,假如每次exe执行时,就会创建临时文件夹,但执行完成后又不销毁,岂不是早就引起我们的笔记本c盘空间溢出了。所以官方是有说明的:

创建临时文件夹后,引导程序将在临时文件夹的上下文中继续与单文件夹捆绑软件一样进行。当捆绑的代码中止时,引导加载程序将删掉临时文件夹。

假如程序崩溃或被杀害,则不会删掉该文件夹(在Unix上为kill-9,在Windows上为TaskManager杀害linux 执行exe文件,在MacOS上为“ForceQuit”)。为此,假若您的应用程序频繁崩溃,则用户将遗失c盘空间到多个临时文件夹。_MEIxxxxxx_MEIxxxxxx

打包Flask项目

pyinstalelr的基础使用就不在这儿过多介绍了,之前的文章有过详尽的说明:

Python打包工具--Pyinstaller详尽介绍:

我们只须要晓得pyinstaller-F(onefile)参数即可将代码最终打包为单个的exe文件即可。

然而Flask的static、templates该如何打包呢?让我们以之前开发过的一个FlaskHttpserver为例说明。

执行文件linux命令_执行文件linux_linux 执行exe文件

首先看下代码结构:

Flask代码目录

settings中放了Flask的一些config配置,manage.py通过新蓝图注册HttpServer中views下的account与home模块。这么,如今我们须要将代码中的static、templates、settings(测试发觉这个配置文件也没办法手动打包,须要自动追加)成单个文件呢?pyinstaller提供了一个[--add-data]的参数,整体打包命令如下:

pyinstaller -F -i BreezePython.ico --add-data="HttpServerstatic;HttpServerstatic" --add-data="HttpServertemplates;Httpservertemplates" --add-data="settings.py;." manage.py

原理就是保持代码中的路径一致,倘若是当前路径使用.进行替换。

有些人认为这个一个一个的添加太麻烦了,这么还有另一种思路。来瞧瞧我们打包后的目录:

执行文件linux_linux 执行exe文件_执行文件linux命令

spec文件的妙用

打包完成后,会生成一个main应用.spec的文件,通过我们昨天一顿--add-data的操作后,spec有哪些区别么?

通过datas添加数据

所以我们可以换另一种方法加载依赖文件:

首次打包时直接-F完成打包编辑*.spec文件,通过在列表中添加对应元祖信息的方法,追加以来稳健pyinstaller-F*.spec进行二次打包即可追加文件至exe中。

来让我们瞧瞧打包后的exe是否可以执行吧:

linux 执行exe文件_执行文件linux命令_执行文件linux

打包疗效展示

OK,一个exe文件拉起整个Flask项目,带着exe我们就可以脱离环境单独运行我们的HTTPServer了。是不是很拉风?

临时文件监控复制

初次测试,可能存在打包路径错误的问题,每次去找临时路径查看太麻烦了,既然写代码linux服务器搭建,不如顺手写个动态监控_MEI路径并完成循环复制的功能,具体实现如下:

判定笔记本的操作系统while循环监控临时目录启动exe工具获取exe创建的_MEI开头文件夹将该临时文件夹拷贝到执行目录

最终代码实现如下:

# -*- coding: utf-8 -*-
# @Author   : 王翔
# @微信号   : King_Uranus
# @公众号    : 清风Python
# @GitHub   : https://github.com/BreezePython
# @Date     : 2020/11/17 23:50:09
# @Software : PyCharm
# @version  :Python 3.7.3
# @File     : get_source_code.py
import platform
import os
import time
import shutil
def get_tmp_path():
    if platform.platform().lower().startswith('windows'):
        return os.getenv('temp')
    else:
        return '/tmp'
class GetSourceCode:
    def __init__(self):
        self.base_path = os.path.dirname(__file__)
        self.tmp_path = get_tmp_path()
        self.basic_dirs = self.get_dirs()
        self.code_dir = None
    def get_dirs(self):
        for root, dirs, files in os.walk(self.tmp_path):
            return set(dirs)
    def get_source_dir(self):
        while True:
            _dir = list(self.get_dirs() - self.basic_dirs)
            if _dir and _dir[0].startswith('_MEI'):
                self.code_dir = _dir[0]
                print("find source code dir %s" % self.code_dir)
                break
            else:
                time.sleep(0.2)
        self.copy_code_dir()
    def copy_code_dir(self):
        abs_tmp_path = os.path.join(self.tmp_path, self.code_dir)
        while os.path.exists(abs_tmp_path):
            source_path = os.path.join(self.base_path, self.code_dir)
            if not os.path.exists(source_path):
                os.mkdir(source_path)
            for root, dirs, files in os.walk(abs_tmp_path):
                for file in files:
                    remote_path = root.replace(abs_tmp_path, source_path).replace('\', '/')
                    if not os.path.exists(remote_path):
                        print(remote_path)
                        os.makedirs(remote_path)
                    if not os.path.exists(remote_path + '/' + file):
                        shutil.copy(os.path.join(root, file), remote_path)
        print("Get source code end.")
if __name__ == '__main__':
    print("start Source Code Analyse project.")
    print("Monitoring source files...")
    g = GetSourceCode()
    g.get_source_dir()

瞧瞧疗效怎么:

动态拷贝源码数据

ok,快把你积攒已久的代码筛选下,瞧瞧这些适宜打包成exe,拿去给同学们显摆吧!

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: 临时 单个 打包 文件 源码
最后更新:2023年10月20日

Linux大神网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

Linux大神网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
Linux主机安全检查期间的安全状况全面分析 常用FTP服务器的几种常用的架构软件介绍 如何像一个内核开发者那样开发linux设备驱动源 Linux下如何使用vsftpd构建后的FTP服务器有哪些特点 Gcc编译器编译语言:C运行库C语言标准 提高网络编程功力的不二之选——Socket/IP协议 C语言教程之linuxC编程实战:linux电子书 #Ubuntu查看防火墙的状态#添加开放普通端口开放22:开启完成 Ubuntu18.04上安装GCC编译器通过终端执行以下命令命令 2019年Linux操作系统启动流程介绍-苏州安亲宝 如何安装Windows10下的WSL和mkfontdir命令? 获取内核源码:阅读linux内核设计的艺术 如何操作Linux启动盘?的安装目录信息详解 (多图预警)多篇Linux(centos7)安装流程 Ubuntu22.04最终发布最终RC版本号召大家积极进行进行测试 如何在Linux安装字体中用到各种命令如mkfontscale? 自带几个预设,你可以在Numix、Arc或Materia主题样式上创建自己的GTK主题 (架构)为什么要在Linux下写C++程序? Ubuntu中各种类型频繁发生的更新错误以及修复方法 图1.3编程的7个步骤,你知道吗?
如何像一个内核开发者那样开发linux设备驱动源常用FTP服务器的几种常用的架构软件介绍Linux主机安全检查期间的安全状况全面分析:身份证明检索失败开始->进程的配置文件微控制器简化存储数据的组织形式如何从Elrepo或者源代码来安装最新的Linux内核4.0Linux下ldd命令的使用方法本身不是一个程序炫龙毁灭者DC还是不能关机和重启内核的窝如何在Ubuntu下修改root用户的密码?Linux系统迁移到另一个硬盘小时就迁移完成了炫龙毁灭者DC还是不能关机和重启内核的窝如何使用Python处理文件数据-程序员必读结合虚拟化技术分析Linux系统的一般执行过程Linux中常用的域名解析命令包括哪些?(回答)炫龙毁灭者DC还是不能关机和重启内核的窝VMware如何安装UbuntuWorkstation虚拟机的博客~(官方个人免费版)开发嵌入式Linux按键驱动程序开发-电脑版软件功能强大,界面简洁明晰、操作方便快捷CentOS8安装新的java环境卸载老版本下载环境介绍Android终端仿真器安装Python的注意事项!!
Linux常用应用工具软件安装管理——RedHatEnterprise存储库 获取linux系统CPU、内存、磁盘IO等信息 Linux开发路由交换设备的理想开发平台 centos启动图形界面的方法.x1,关闭界面 上海会计培训-如何获取日期字符串的时间戳? 如何查看自己电脑的配置高低的方法-软件功能 (Linux软件包管理)包安装安装(Shell或Java脚本) 如何在Linux使用unzip命令合并解压分卷文件文件? 什么是Windows系统MicrosoftWindows,linux系统和windows系统的区别 简小历--诚聘运维主管工作人员(ISAServer) 利用TechBubbleTechnologies物联网JumpWayPythonMQTT库进行通信派 Linux生态系统开发工具总结环境开发的工具介绍 Linux中新原始磁盘的完整步骤,你知道吗? 学习JAVA必须得安装一下JDK(developmentkitjava开发工具包) 安装linux的系统光驱redhat安装的方法 Linux启动时,不使用图形界面可能更有效率! 关于Linux内核的交叉编译步骤和方法:步骤、方法 成为一名合格的嵌入式Linux开发工程师需要学习哪些知识? 使用Docker搭建poste,自建邮局服务mailcow,mailcow功能上比poste更丰富 基于嵌入式��闹悄苁只�长沙理工大学
标签聚合
操作 内核 文件目录 linux系统 linux服务器 软件 命令 文件 虚拟机 应用
书籍
课程
技术群
技术干货大合集↓
  • 2023年12月 / 18篇
  • 2023年11月 / 88篇
  • 2023年10月 / 94篇
  • 2023年9月 / 90篇
  • 2023年8月 / 93篇
  • 2023年7月 / 94篇
  • 2023年6月 / 90篇
  • 2023年5月 / 93篇
  • 2023年4月 / 90篇
  • 2023年3月 / 129篇
  • 2023年2月 / 84篇
  • 2023年1月 / 161篇
  • 2022年12月 / 187篇
  • 2022年11月 / 76篇
友情链接:

Linux书籍 | Linux命令 | Linux系统 | RHCE红帽认证 | Linux软件 | Linux教程 | CentOS系统 | Linux内核 | Linux服务器 | Linux大神 | IT资源

COPYRIGHT © 2024 linuxgod.net ALL RIGHTS RESERVED.