一键整合,万用万灵,Python3.10项目嵌入式一键整合包的制作(Embed)
我们知道Python是一门解释型语言,项目运行时需要依赖Python解释器,并且有时候需要安装项目中对应的三方依赖库。对于专业的Python开发者来说,可以直接通过pip命令进行安装即可。但是如果是分发给其他的Windows用户,特别是不熟悉Python的人来说,这样过于繁琐。因此最好的办法是连同Python解释器和Python项目打包在一起,通过嵌入式一键整合包解决项目的分发问题。
本次我们以一键扒谱的项目为例子,演示如何将项目直接打包为一键整合包,方便其他用户运行使用。
嵌入式Python处理
首先克隆我们自己的项目:
git clone https://github.com/v3ucn/YiJianBaPu.git
正常流程是通过pip安装项目的依赖。
但现在我们不直接通过pip安装依赖,而是通过嵌入式的安装包。
进入Python官方的下载页面:
https://www.python.org/downloads/windows/
下载Windows embeddable package (64-bit)安装包,注意是embeddable版本的,并不是传统安装包,同时版本也需要和开发项目的Python版本吻合:

随后将其解压到项目的根目录,并且下载get-pip.py文件,放入到刚刚解压的安装包内,下载地址:
https://bootstrap.pypa.io/get-pip.py
放入之后的目录结构如下:
D:\work\YiJianBaPu\python310>tree /f
Folder PATH listing for volume 新加卷
Volume serial number is 9824-5798
D:. get-pip.py libcrypto-1_1.dll libffi-7.dll libssl-1_1.dll LICENSE.txt pyexpat.pyd python.cat python.exe python3.dll python310.dll python310.zip python310._pth pythonw.exe select.pyd sqlite3.dll unicodedata.pyd vcruntime140.dll vcruntime140_1.dll winsound.pyd _asyncio.pyd _bz2.pyd _ctypes.pyd _decimal.pyd _elementtree.pyd _hashlib.pyd _lzma.pyd _msi.pyd _multiprocessing.pyd _overlapped.pyd _queue.pyd _socket.pyd _sqlite3.pyd _ssl.pyd _uuid.pyd _zoneinfo.pyd
随后在项目的根目录执行命令:
.\python310\python.exe .\python310\get-pip.py
注意这里的python.exe并不是本地开发环境的Python,而是嵌入式解释器的Python。
此时我们的目录中多出两个文件夹Lib和Scripts:
D:\work\YiJianBaPu\python310>tree
Folder PATH listing for volume 新加卷
Volume serial number is 9824-5798
D:.
├───Lib
│ └───site-packages
│ ├───pip
│ │ ├───_internal
│ │ │ ├───cli
│ │ │ │ └───__pycache__
│ │ │ ├───commands
│ │ │ │ └───__pycache__
│ │ │ ├───distributions
│ │ │ │ └───__pycache__
│ │ │ ├───index
│ │ │ │ └───__pycache__
│ │ │ ├───locations
│ │ │ │ └───__pycache__
│ │ │ ├───metadata
│ │ │ │ ├───importlib
│ │ │ │ │ └───__pycache__
│ │ │ │ └───__pycache__
│ │ │ ├───models
│ │ │ │ └───__pycache__
│ │ │ ├───network
│ │ │ │ └───__pycache__
│ │ │ ├───operations
│ │ │ │ ├───build
│ │ │ │ │ └───__pycache__
│ │ │ │ ├───install
│ │ │ │ │ └───__pycache__
│ │ │ │ └───__pycache__
│ │ │ ├───req
│ │ │ │ └───__pycache__
│ │ │ ├───resolution
│ │ │ │ ├───legacy
│ │ │ │ │ └───__pycache__
│ │ │ │ ├───resolvelib
│ │ │ │ │ └───__pycache__
│ │ │ │ └───__pycache__
│ │ │ ├───utils
│ │ │ │ └───__pycache__
│ │ │ ├───vcs
│ │ │ │ └───__pycache__
│ │ │ └───__pycache__
│ │ ├───_vendor
│ │ │ ├───cachecontrol
│ │ │ │ ├───caches
│ │ │ │ │ └───__pycache__
│ │ │ │ └───__pycache__
│ │ │ ├───certifi
│ │ │ │ └───__pycache__
│ │ │ ├───chardet
│ │ │ │ ├───cli
│ │ │ │ │ └───__pycache__
│ │ │ │ ├───metadata
│ │ │ │ │ └───__pycache__
│ │ │ │ └───__pycache__
│ │ │ ├───colorama
│ │ │ │ ├───tests
│ │ │ │ │ └───__pycache__
│ │ │ │ └───__pycache__
│ │ │ ├───distlib
│ │ │ │ └───__pycache__
│ │ │ ├───distro
│ │ │ │ └───__pycache__
│ │ │ ├───idna
│ │ │ │ └───__pycache__
│ │ │ ├───msgpack
│ │ │ │ └───__pycache__
│ │ │ ├───packaging
│ │ │ │ └───__pycache__
│ │ │ ├───pkg_resources
│ │ │ │ └───__pycache__
│ │ │ ├───platformdirs
│ │ │ │ └───__pycache__
│ │ │ ├───pygments
│ │ │ │ ├───filters
│ │ │ │ │ └───__pycache__
│ │ │ │ ├───formatters
│ │ │ │ │ └───__pycache__
│ │ │ │ ├───lexers
│ │ │ │ │ └───__pycache__
│ │ │ │ ├───styles
│ │ │ │ │ └───__pycache__
│ │ │ │ └───__pycache__
│ │ │ ├───pyparsing
│ │ │ │ ├───diagram
│ │ │ │ │ └───__pycache__
│ │ │ │ └───__pycache__
│ │ │ ├───pyproject_hooks
│ │ │ │ ├───_in_process
│ │ │ │ │ └───__pycache__
│ │ │ │ └───__pycache__
│ │ │ ├───requests
│ │ │ │ └───__pycache__
│ │ │ ├───resolvelib
│ │ │ │ ├───compat
│ │ │ │ │ └───__pycache__
│ │ │ │ └───__pycache__
│ │ │ ├───rich
│ │ │ │ └───__pycache__
│ │ │ ├───tenacity
│ │ │ │ └───__pycache__
│ │ │ ├───tomli
│ │ │ │ └───__pycache__
│ │ │ ├───truststore
│ │ │ │ └───__pycache__
│ │ │ ├───urllib3
│ │ │ │ ├───contrib
│ │ │ │ │ ├───_securetransport
│ │ │ │ │ │ └───__pycache__
│ │ │ │ │ └───__pycache__
│ │ │ │ ├───packages
│ │ │ │ │ ├───backports
│ │ │ │ │ │ └───__pycache__
│ │ │ │ │ └───__pycache__
│ │ │ │ ├───util
│ │ │ │ │ └───__pycache__
│ │ │ │ └───__pycache__
│ │ │ ├───webencodings
│ │ │ │ └───__pycache__
│ │ │ └───__pycache__
│ │ └───__pycache__
│ ├───pip-23.3.1.dist-info
│ ├───pkg_resources
│ │ ├───extern
│ │ │ └───__pycache__
│ │ ├───_vendor
│ │ │ ├───importlib_resources
│ │ │ │ └───__pycache__
│ │ │ ├───jaraco
│ │ │ │ ├───text
│ │ │ │ │ └───__pycache__
│ │ │ │ └───__pycache__
│ │ │ ├───more_itertools
│ │ │ │ └───__pycache__
│ │ │ ├───packaging
│ │ │ │ └───__pycache__
│ │ │ ├───platformdirs
│ │ │ │ └───__pycache__
│ │ │ └───__pycache__
│ │ └───__pycache__
│ ├───setuptools
│ │ ├───command
│ │ │ └───__pycache__
│ │ ├───config
│ │ │ ├───_validate_pyproject
│ │ │ │ └───__pycache__
│ │ │ └───__pycache__
│ │ ├───extern
│ │ │ └───__pycache__
│ │ ├───_distutils
│ │ │ ├───command
│ │ │ │ └───__pycache__
│ │ │ └───__pycache__
│ │ ├───_vendor
│ │ │ ├───importlib_metadata
│ │ │ │ └───__pycache__
│ │ │ ├───importlib_resources
│ │ │ │ └───__pycache__
│ │ │ ├───jaraco
│ │ │ │ ├───text
│ │ │ │ │ └───__pycache__
│ │ │ │ └───__pycache__
│ │ │ ├───more_itertools
│ │ │ │ └───__pycache__
│ │ │ ├───packaging
│ │ │ │ └───__pycache__
│ │ │ ├───tomli
│ │ │ │ └───__pycache__
│ │ │ └───__pycache__
│ │ └───__pycache__
│ ├───setuptools-68.2.2.dist-info
│ └───_distutils_hack
│ └───__pycache__
└───Scripts
随后修改python310._pth文件,将内容改成下面这样:
python310.zip
. # Uncomment to run site.main() automatically
import site
至此,嵌入式解释器就配置好了。
嵌入式安装依赖
此后,当我们需要安装依赖时,必须用嵌入式的解释器进行安装:
.\python310\python.exe -m pip install noisereduce -t E:\work\YiJianBaPu\python310\Lib\site-packages
上面的命令展示如何嵌入式安装依赖库noisereduce。
这里需要注意的时,解释器必须是嵌入式解释器.\python310\python.exe,同时通过-t参数来指定三方库的位置,也就是说,必须安装到项目的目录中,而不是系统的默认开发环境目录。
安装成功后,我们必须可以在项目的目录下可以找到这个库:
D:\work\YiJianBaPu\python310\Lib\site-packages>tree
Folder PATH listing for volume 新加卷
Volume serial number is 9824-5798
D:.
├───noisereduce
│ ├───spectralgate
│ │ └───__pycache__
│ ├───torchgate
│ │ └───__pycache__
│ └───__pycache__
如此,依赖和解释器就紧密结合在一起了,换台机器,并不需要安装也可以直接启动。
一键启动
现在,我们来编写一键启动脚本,launch.bat文件:
@echo off
chcp 65001
@echo 开始运行
call .\python310\python.exe -m spleeter separate -p spleeter:2stems -o ./output ./test.mp3
call .\python310\python.exe ./infer.py --model ./ckpt/model_ckpt_steps_104000_simplified.ckpt --wav ./output/test/vocals.wav
@echo 处理完毕,请按任意键
call pause
这里chcp命令用来声明编码,防止中文提示乱码。
call用来执行脚本,注意解释器必须使用项目内置的嵌入式解释器.\python310\python.exe
随后双击执行脚本launch.bat,程序返回:
Active code page: 65001
开始运行
INFO:spleeter:File ./output\test/vocals.wav written succesfully
INFO:spleeter:File ./output\test/accompaniment.wav written succesfully
accumulate_grad_batches: 1, audio_sample_rate: 44100, binarization_args: {'num_workers': 0, 'shuffle': True}, binarizer_cls: preprocessing.MIDIExtractionBinarizer, binary_data_dir: data/some_ds_fixmel_spk3_aug8/binary,
clip_grad_norm: 1, dataloader_prefetch_factor: 2, ddp_backend: nccl, ds_workers: 4, finetune_ckpt_path: None,
finetune_enabled: False, finetune_ignored_params: [], finetune_strict_shapes: True, fmax: 8000, fmin: 40,
freezing_enabled: False, frozen_params: [], hop_size: 512, log_interval: 100, lr_scheduler_args: {'min_lr': 1e-05, 'scheduler_cls': 'lr_scheduler.scheduler.WarmupLR', 'warmup_steps': 5000},
max_batch_frames: 80000, max_batch_size: 8, max_updates: 10000000, max_val_batch_frames: 10000, max_val_batch_size: 1,
midi_extractor_args: {'attention_drop': 0.1, 'attention_heads': 8, 'attention_heads_dim': 64, 'conv_drop': 0.1, 'dim': 512, 'ffn_latent_drop': 0.1, 'ffn_out_drop': 0.1, 'kernel_size': 31, 'lay': 8, 'use_lay_skip': True}, midi_max: 127, midi_min: 0, midi_num_bins: 128, midi_prob_deviation: 1.0,
midi_shift_proportion: 0.0, midi_shift_range: [-6, 6], model_cls: modules.model.Gmidi_conform.midi_conforms, num_ckpt_keep: 5, num_sanity_val_steps: 1,
num_valid_plots: 300, optimizer_args: {'beta1': 0.9, 'beta2': 0.98, 'lr': 0.0001, 'optimizer_cls': 'torch.optim.AdamW', 'weight_decay': 0}, pe: rmvpe, pe_ckpt: pretrained/rmvpe/model.pt, permanent_ckpt_interval: 40000,
permanent_ckpt_start: 200000, pl_trainer_accelerator: auto, pl_trainer_devices: auto, pl_trainer_num_nodes: 1, pl_trainer_precision: 32-true,
pl_trainer_strategy: auto, raw_data_dir: [], rest_threshold: 0.1, sampler_frame_count_grid: 6, seed: 114514,
sort_by_len: True, task_cls: training.MIDIExtractionTask, test_prefixes: None, train_set_name: train, units_dim: 80,
units_encoder: mel, units_encoder_ckpt: pretrained/contentvec/checkpoint_best_legacy_500.pt, use_buond_loss: True, use_midi_loss: True, val_check_interval: 4000,
valid_set_name: valid, win_size: 2048
| load 'model' from 'ckpt\model_ckpt_steps_104000_simplified.ckpt'.
100%|████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:01<00:00, 1.88it/s]
处理完毕,请按任意键
Press any key to continue . . .
可以看到,执行结果和传统终端执行的结果是一致的。
区别是使用者并不需要本地配置Python环境,只需要下载项目的整合包即可。
结语
通过嵌入式打包,可以把Python程序和解释器、依赖库一并打包分发给非专业用户,由此就提高了这部分用户群体的使用体验,最后奉上打包后的整合包,以飨众乡亲:
链接:https://pan.baidu.com/s/1HN3LAusdtofwqtb4gnSwvQ?pwd=72yq
相关文章:
一键整合,万用万灵,Python3.10项目嵌入式一键整合包的制作(Embed)
我们知道Python是一门解释型语言,项目运行时需要依赖Python解释器,并且有时候需要安装项目中对应的三方依赖库。对于专业的Python开发者来说,可以直接通过pip命令进行安装即可。但是如果是分发给其他的Windows用户,特别是不熟悉Py…...
MAC地址注册的网络安全影响和措施分析
MAC地址注册对网络安全具有重要影响,同时也需要采取相应的措施来应对潜在的安全风险。以下是有关MAC地址注册的网络安全影响和应对措施的分析: 影响: 1. 身份验证:MAC地址注册可用于设备的身份验证,但MAC地址本身并不…...
某个订单项目记录,涉及MQ消息处理、分布式问题、幂等性等问题解决设计
文章目录 消息队列(Message Queue)什么场景下,使用消息队列?消息队列 概述 RabbitMQ 消息队列RabbitMQ 概念名词 概念RabbitMQ 流程 RabbitMQ 安装RabbitMQ 页面介绍Exchange 交换机类型Spring Boot 整合RabbitMQAmqpAdmin 与 Rab…...
excel中的OFFSET函数
介绍 OFFSET函数是确定从基点出发移动后的引用区域。它有5个参数: 第1个参数是引用的参考基点区域第2个参数是移动的行数,正数代表向下移动的行数,负数代表向上移动的行数第3个参数是移动的列数,正数代表向右移动的列数…...
力扣:168. Excel表列名称(Python3)
题目: 给你一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。 例如: A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 来源:力扣(LeetCode) 链接:力扣&…...
短视频账号矩阵系统源码/技术源码分享/技术搭建架构
短视频账号矩阵系统----技术源码分享/技术搭建架构 抖音seo又叫抖音搜索引擎,只要能做到布词,和过去的百度seo优化一样,布词,布关键词,当搜索栏搜索时可以搜索到该短视频。优化视频关键词,做好关键词的优化…...
Nginx负载均衡时,验证码老是错误
问题 正式环境里,登录之后没有跳转到之前的页面,在测试服务器上测试了一下这个BUG,不存在这个问题 问题原因 我们的服务器做了负载均衡,问题出现之后,就问了运维,负载均衡的规则是什么,默认情况…...
Unity3D ugui获取ui控件屏幕坐标
local worldPos uiGo.Transform.position local uiCamera GetUICamera() local screenPos uiCamera:WorldToScreenPoint(worldPos)...
数字化转型的“支点”是什么?
当前,数字化转型在推动各行各业降本增效的过程中扮演着越来越重要的角色,数字化转型不仅可以提高企业的生产效率和降低企业生产经营成本,也成为了推动经济发展的新引擎。对于企业而言,想要成功推动企业数字化转型,不…...
Spring Task单机定时任务(使用及阻塞问题解决)
一、介绍 SpringTask是Spring自主研发的定时任务工具,并且存在于Spring体系中,不需要添加任何依赖 Spring Boot 默认在无任何第三方依赖的情况下使用 spring-context 模块下提供的定时任务工具 Spring Task。 我们只需要使用 EnableScheduling 注解就可…...
石原子科技亮相2023成都市信息领域新产品发布会
2023年11月13日至15日,由成都市互联网信息办公室、四川天府新区管委会、成都市经信局市新经济委、成都市农业农村局指导的以“信息创造价值 创新引领未来”为主题的成都市信息领域新产品发布会在科创生态岛1号馆举行。围绕人工智能、区块链、数字化绿色化、数字乡村…...
2023数维杯国际赛数学建模竞赛选题建议及D题思路讲解
大家好呀,2023年第九届数维杯国际大学生数学建模挑战赛今天早上开赛啦,在这里先带来初步的选题建议及思路。 目前团队正在写B题和D题完整论文,后续还会持续更新哈,大家三连关注一下防止迷路。 注意,本文只是比较简略…...
最新宝塔反代openai官方API开发接口详细搭建教程,解决502 Bad Gateway问题
一、前言 宝塔反代openai官方API接口详细教程,实现国内使用ChatGPT502 Bad Gateway问题解决, 此方法最简单快捷,没有复杂步骤,不容易出错,即最简单,零代码、零部署的方法。 二、实现前提 一台海外服务器…...
vue3 实现pdf预览
需要下载pdfjs-dist <template><a-modal class"fill-modal" v-model:open"state.visible" :title"state.modalTitle" width"50%" cancel"handleCancel"><div class"preview-btns-posi"><a-…...
【React】Redux基本使用
什么情况使用 Redux ? Redux 适用于多交互、多数据源的场景。简单理解就是复杂 从组件角度去考虑的话,当我们有以下的应用场景时,我们可以尝试采用 Redux 来实现 某个组件的状态需要共享时 一个组件需要改变其他组件的状态时 一个组件需要…...
Banana Pi BPI-W3之RK3588安装Qt+opencv+采集摄像头画面.
场景:在Banana Pi BPI-W3 RK3588上做qt开发工作RK3588安装Qtopencv采集摄像头画面 2. 环境介绍 硬件环境: Banana Pi BPI-W3RK3588开发板、MIPI-CSI摄像头( ArmSoM官方配件 )软件版本: OS:ArmSoM-W3 Debian11 QT:QT5…...
OCR转换技巧:如何避免图片转Word时出现多余的换行?
在将图片中的文字识别转换为Word文档时,我们很多时候时会遇到识别内容的一个自然段还没结束就换行的问题,这些就是我们常说的多余换行的问题。为什么会产生这个问题呢?主要是由于OCR返回的识别结果是按图片上的文字换行而换行,而不…...
抖音小店怎么对接达人?如何避免达人白嫖样品?实操经验分享!
我是电商珠珠 很多新手在入驻完抖音小店之后,首先做的就是通过设置店铺活动去跑自然流量,之后再去搞达人流量。 但是部分新手在搞达人流量时所遇到的问题一般都是给达人发消息,达人不搭理,达人白嫖自己的样品,还有就…...
Xocde 升级15 或者 iOS17报错:
错误: Assertion failed: (false && "compact unwind compressed function offset doesnt fit in 24 bits"), function operator(), file Layout.cpp, line 5758. 翻译: 断言失败:(false&&“压缩展开…...
Apache配置ssl证书-实现https访问
文章目录 一、准备工作1.1 安装Apache服务器1.2 Apache服务器上已经开启了443端口1.3 Apache服务器上已安装了mod_ssl.so模块1.4 获取SSL证书 二、配置apache2.1 配置apache文件2.2 生效配置文件 一、准备工作 1.1 安装Apache服务器 yum install httpd -y1.2 Apache服务器上已…...
AArch64虚拟内存系统架构与页表转换机制详解
1. AArch64虚拟内存系统架构概述在AArch64架构中,虚拟内存系统是处理器核心功能之一,它通过多级页表机制实现虚拟地址到物理地址的转换。这套系统不仅支持常规的内存管理需求,还针对虚拟化、安全隔离等场景提供了丰富的硬件支持特性。虚拟内存…...
Unity根运动偏移问题:原理、诊断与五种生产级解决方案
1. 这个问题不是Bug,是Mecanim对根运动(Root Motion)的“诚实执行”你有没有遇到过这样的情况:在Unity里给一个角色模型配好了一套行走、奔跑、跳跃动画,一切看起来都很正常——预览窗口里动画流畅,状态机切…...
Unity安卓游戏开发实战:从构建失败到上线合规的工程化路径
1. 为什么“精通Unity安卓游戏开发”不是一句口号,而是一道必须拆解的工程题很多人看到“精通Unity安卓游戏开发”这个标题,第一反应是:不就是用Unity写个游戏,然后点一下Build Android?我做过三个小游戏,打…...
小红书“素人感”文案炼成术(反AI痕迹终极方案):用ChatGPT生成却像真人手写的7个微表情锚点
更多请点击: https://codechina.net 第一章:小红书“素人感”文案的本质认知 什么是“素人感”? “素人感”并非指真实素人所写,而是一种精心设计的语言风格系统——它通过弱化专业修辞、保留口语冗余、嵌入即时情绪标记&#x…...
Unity游戏本地化:XUnity Auto Translator运行时文本注入方案
1. 这不是“翻译插件”,而是一套专为Unity游戏本地化设计的轻量级运行时注入方案你有没有遇到过这样的情况:接手一个老项目,UI文本全写死在代码里,或者Text组件上直接填了中文字符串;美术给的按钮图上还带着“开始游戏…...
AArch64缓存架构解析与性能优化实践
1. AArch64缓存架构基础解析AArch64架构作为ARMv8指令集的64位执行状态,其缓存系统设计体现了现代处理器架构的典型特征。缓存作为CPU与主存之间的高速缓冲存储器,通过存储频繁访问的数据和指令来减少内存访问延迟。在AArch64中,缓存被组织为…...
【脑机接口】迁移学习 域自适应 自监督 EEG 大模型术语解释(第9弹)
266.迁移学习 TL:迁移学习是把一个场景中学到的知识迁移到另一个相关场景中的方法。在 EEG 中,源域通常是已有被试、已有会话或已有数据集,目标域通常是新被试、新会话或小样本数据。它的核心目的,是减少目标被试需要采集的校准数…...
保姆级教程:用向日葵远程在Windows系统上安装Vector CANape 21.0.10(附Demo工程位置详解)
Vector CANape 21.0.10安装全流程与实战技巧作为一名长期从事汽车电子测试的工程师,我深知Vector CANape在ECU标定与诊断领域的重要性。本文将从一个技术实践者的角度,详细解析如何高效完成CANape 21.0.10的安装部署,特别是针对远程协作安装场…...
美团mtgsig签名环境模拟:Android Native层风控对抗实战
1. 这不是写个JS就能跑通的事:为什么mtgsig签名环境模拟是逆向工程里最硬的骨头“美团外卖mtgsig签名”这八个字,在安卓逆向、风控对抗、自动化测试圈子里,几乎等同于一道分水岭。它不像普通API签名那样靠抓包改参就能绕过,也不像…...
混沌系统预测方法全景评测:从线性回归到神经ODE的实战指南
1. 项目概述:混沌系统预测的“兵器谱”与实战评测在动力系统建模和时间序列预测这个行当里混了十几年,我见过太多同行面对混沌系统时那种“既爱又恨”的复杂心情。爱的是它背后深刻的物理内涵和广泛的应用前景,从大气湍流到金融市场ÿ…...
