翼度科技»论坛 编程开发 python 查看内容

一键整合,万用万灵,Python3.10项目嵌入式一键整合包的制作(Embed)

10

主题

10

帖子

30

积分

新手上路

Rank: 1

积分
30
我们知道Python是一门解释型语言,项目运行时需要依赖Python解释器,并且有时候需要安装项目中对应的三方依赖库。对于专业的Python开发者来说,可以直接通过pip命令进行安装即可。但是如果是分发给其他的Windows用户,特别是不熟悉Python的人来说,这样过于繁琐。因此最好的办法是连同Python解释器和Python项目打包在一起,通过嵌入式一键整合包解决项目的分发问题。
本次我们以一键扒谱的项目为例子,演示如何将项目直接打包为一键整合包,方便其他用户运行使用。
嵌入式Python处理

首先克隆我们自己的项目:
  1. git clone https://github.com/v3ucn/YiJianBaPu.git
复制代码
正常流程是通过pip安装项目的依赖。
但现在我们不直接通过pip安装依赖,而是通过嵌入式的安装包。
进入Python官方的下载页面:
  1. https://www.python.org/downloads/windows/
复制代码
下载Windows embeddable package (64-bit)安装包,注意是embeddable版本的,并不是传统安装包,同时版本也需要和开发项目的Python版本吻合:

随后将其解压到项目的根目录,并且下载get-pip.py文件,放入到刚刚解压的安装包内,下载地址:
  1. https://bootstrap.pypa.io/get-pip.py
复制代码
放入之后的目录结构如下:
  1. D:\work\YiJianBaPu\python310>tree /f  
  2. Folder PATH listing for volume 新加卷  
  3. Volume serial number is 9824-5798  
  4. D:.  
  5.     get-pip.py  
  6.     libcrypto-1_1.dll  
  7.     libffi-7.dll  
  8.     libssl-1_1.dll  
  9.     LICENSE.txt  
  10.     pyexpat.pyd  
  11.     python.cat  
  12.     python.exe  
  13.     python3.dll  
  14.     python310.dll  
  15.     python310.zip  
  16.     python310._pth  
  17.     pythonw.exe  
  18.     select.pyd  
  19.     sqlite3.dll  
  20.     unicodedata.pyd  
  21.     vcruntime140.dll  
  22.     vcruntime140_1.dll  
  23.     winsound.pyd  
  24.     _asyncio.pyd  
  25.     _bz2.pyd  
  26.     _ctypes.pyd  
  27.     _decimal.pyd  
  28.     _elementtree.pyd  
  29.     _hashlib.pyd  
  30.     _lzma.pyd  
  31.     _msi.pyd  
  32.     _multiprocessing.pyd  
  33.     _overlapped.pyd  
  34.     _queue.pyd  
  35.     _socket.pyd  
  36.     _sqlite3.pyd  
  37.     _ssl.pyd  
  38.     _uuid.pyd  
  39.     _zoneinfo.pyd
复制代码
随后在项目的根目录执行命令:
  1. .\python310\python.exe .\python310\get-pip.py
复制代码
注意这里的python.exe并不是本地开发环境的Python,而是嵌入式解释器的Python。
此时我们的目录中多出两个文件夹Lib和Scripts:
  1. D:\work\YiJianBaPu\python310>tree  
  2. Folder PATH listing for volume 新加卷  
  3. Volume serial number is 9824-5798  
  4. D:.  
  5. ├───Lib  
  6. │   └───site-packages  
  7. │       ├───pip  
  8. │       │   ├───_internal  
  9. │       │   │   ├───cli  
  10. │       │   │   │   └───__pycache__  
  11. │       │   │   ├───commands  
  12. │       │   │   │   └───__pycache__  
  13. │       │   │   ├───distributions  
  14. │       │   │   │   └───__pycache__  
  15. │       │   │   ├───index  
  16. │       │   │   │   └───__pycache__  
  17. │       │   │   ├───locations  
  18. │       │   │   │   └───__pycache__  
  19. │       │   │   ├───metadata  
  20. │       │   │   │   ├───importlib  
  21. │       │   │   │   │   └───__pycache__  
  22. │       │   │   │   └───__pycache__  
  23. │       │   │   ├───models  
  24. │       │   │   │   └───__pycache__  
  25. │       │   │   ├───network  
  26. │       │   │   │   └───__pycache__  
  27. │       │   │   ├───operations  
  28. │       │   │   │   ├───build  
  29. │       │   │   │   │   └───__pycache__  
  30. │       │   │   │   ├───install  
  31. │       │   │   │   │   └───__pycache__  
  32. │       │   │   │   └───__pycache__  
  33. │       │   │   ├───req  
  34. │       │   │   │   └───__pycache__  
  35. │       │   │   ├───resolution  
  36. │       │   │   │   ├───legacy  
  37. │       │   │   │   │   └───__pycache__  
  38. │       │   │   │   ├───resolvelib  
  39. │       │   │   │   │   └───__pycache__  
  40. │       │   │   │   └───__pycache__  
  41. │       │   │   ├───utils  
  42. │       │   │   │   └───__pycache__  
  43. │       │   │   ├───vcs  
  44. │       │   │   │   └───__pycache__  
  45. │       │   │   └───__pycache__  
  46. │       │   ├───_vendor  
  47. │       │   │   ├───cachecontrol  
  48. │       │   │   │   ├───caches  
  49. │       │   │   │   │   └───__pycache__  
  50. │       │   │   │   └───__pycache__  
  51. │       │   │   ├───certifi  
  52. │       │   │   │   └───__pycache__  
  53. │       │   │   ├───chardet  
  54. │       │   │   │   ├───cli  
  55. │       │   │   │   │   └───__pycache__  
  56. │       │   │   │   ├───metadata  
  57. │       │   │   │   │   └───__pycache__  
  58. │       │   │   │   └───__pycache__  
  59. │       │   │   ├───colorama  
  60. │       │   │   │   ├───tests  
  61. │       │   │   │   │   └───__pycache__  
  62. │       │   │   │   └───__pycache__  
  63. │       │   │   ├───distlib  
  64. │       │   │   │   └───__pycache__  
  65. │       │   │   ├───distro  
  66. │       │   │   │   └───__pycache__  
  67. │       │   │   ├───idna  
  68. │       │   │   │   └───__pycache__  
  69. │       │   │   ├───msgpack  
  70. │       │   │   │   └───__pycache__  
  71. │       │   │   ├───packaging  
  72. │       │   │   │   └───__pycache__  
  73. │       │   │   ├───pkg_resources  
  74. │       │   │   │   └───__pycache__  
  75. │       │   │   ├───platformdirs  
  76. │       │   │   │   └───__pycache__  
  77. │       │   │   ├───pygments  
  78. │       │   │   │   ├───filters  
  79. │       │   │   │   │   └───__pycache__  
  80. │       │   │   │   ├───formatters  
  81. │       │   │   │   │   └───__pycache__  
  82. │       │   │   │   ├───lexers  
  83. │       │   │   │   │   └───__pycache__  
  84. │       │   │   │   ├───styles  
  85. │       │   │   │   │   └───__pycache__  
  86. │       │   │   │   └───__pycache__  
  87. │       │   │   ├───pyparsing  
  88. │       │   │   │   ├───diagram  
  89. │       │   │   │   │   └───__pycache__  
  90. │       │   │   │   └───__pycache__  
  91. │       │   │   ├───pyproject_hooks  
  92. │       │   │   │   ├───_in_process  
  93. │       │   │   │   │   └───__pycache__  
  94. │       │   │   │   └───__pycache__  
  95. │       │   │   ├───requests  
  96. │       │   │   │   └───__pycache__  
  97. │       │   │   ├───resolvelib  
  98. │       │   │   │   ├───compat  
  99. │       │   │   │   │   └───__pycache__  
  100. │       │   │   │   └───__pycache__  
  101. │       │   │   ├───rich  
  102. │       │   │   │   └───__pycache__  
  103. │       │   │   ├───tenacity  
  104. │       │   │   │   └───__pycache__  
  105. │       │   │   ├───tomli  
  106. │       │   │   │   └───__pycache__  
  107. │       │   │   ├───truststore  
  108. │       │   │   │   └───__pycache__  
  109. │       │   │   ├───urllib3  
  110. │       │   │   │   ├───contrib  
  111. │       │   │   │   │   ├───_securetransport  
  112. │       │   │   │   │   │   └───__pycache__  
  113. │       │   │   │   │   └───__pycache__  
  114. │       │   │   │   ├───packages  
  115. │       │   │   │   │   ├───backports  
  116. │       │   │   │   │   │   └───__pycache__  
  117. │       │   │   │   │   └───__pycache__  
  118. │       │   │   │   ├───util  
  119. │       │   │   │   │   └───__pycache__  
  120. │       │   │   │   └───__pycache__  
  121. │       │   │   ├───webencodings  
  122. │       │   │   │   └───__pycache__  
  123. │       │   │   └───__pycache__  
  124. │       │   └───__pycache__  
  125. │       ├───pip-23.3.1.dist-info  
  126. │       ├───pkg_resources  
  127. │       │   ├───extern  
  128. │       │   │   └───__pycache__  
  129. │       │   ├───_vendor  
  130. │       │   │   ├───importlib_resources  
  131. │       │   │   │   └───__pycache__  
  132. │       │   │   ├───jaraco  
  133. │       │   │   │   ├───text  
  134. │       │   │   │   │   └───__pycache__  
  135. │       │   │   │   └───__pycache__  
  136. │       │   │   ├───more_itertools  
  137. │       │   │   │   └───__pycache__  
  138. │       │   │   ├───packaging  
  139. │       │   │   │   └───__pycache__  
  140. │       │   │   ├───platformdirs  
  141. │       │   │   │   └───__pycache__  
  142. │       │   │   └───__pycache__  
  143. │       │   └───__pycache__  
  144. │       ├───setuptools  
  145. │       │   ├───command  
  146. │       │   │   └───__pycache__  
  147. │       │   ├───config  
  148. │       │   │   ├───_validate_pyproject  
  149. │       │   │   │   └───__pycache__  
  150. │       │   │   └───__pycache__  
  151. │       │   ├───extern  
  152. │       │   │   └───__pycache__  
  153. │       │   ├───_distutils  
  154. │       │   │   ├───command  
  155. │       │   │   │   └───__pycache__  
  156. │       │   │   └───__pycache__  
  157. │       │   ├───_vendor  
  158. │       │   │   ├───importlib_metadata  
  159. │       │   │   │   └───__pycache__  
  160. │       │   │   ├───importlib_resources  
  161. │       │   │   │   └───__pycache__  
  162. │       │   │   ├───jaraco  
  163. │       │   │   │   ├───text  
  164. │       │   │   │   │   └───__pycache__  
  165. │       │   │   │   └───__pycache__  
  166. │       │   │   ├───more_itertools  
  167. │       │   │   │   └───__pycache__  
  168. │       │   │   ├───packaging  
  169. │       │   │   │   └───__pycache__  
  170. │       │   │   ├───tomli  
  171. │       │   │   │   └───__pycache__  
  172. │       │   │   └───__pycache__  
  173. │       │   └───__pycache__  
  174. │       ├───setuptools-68.2.2.dist-info  
  175. │       └───_distutils_hack  
  176. │           └───__pycache__  
  177. └───Scripts
复制代码
随后修改python310._pth文件,将内容改成下面这样:
  1. python310.zip  
  2. .  
  3.   
  4. # Uncomment to run site.main() automatically  
  5. import site
复制代码
至此,嵌入式解释器就配置好了。
嵌入式安装依赖

此后,当我们需要安装依赖时,必须用嵌入式的解释器进行安装:
  1. .\python310\python.exe -m pip install noisereduce -t E:\work\YiJianBaPu\python310\Lib\site-packages
复制代码
上面的命令展示如何嵌入式安装依赖库noisereduce。
这里需要注意的时,解释器必须是嵌入式解释器.\python310\python.exe,同时通过-t参数来指定三方库的位置,也就是说,必须安装到项目的目录中,而不是系统的默认开发环境目录。
安装成功后,我们必须可以在项目的目录下可以找到这个库:
  1. D:\work\YiJianBaPu\python310\Lib\site-packages>tree  
  2. Folder PATH listing for volume 新加卷  
  3. Volume serial number is 9824-5798  
  4. D:.  
  5. ├───noisereduce  
  6. │   ├───spectralgate  
  7. │   │   └───__pycache__  
  8. │   ├───torchgate  
  9. │   │   └───__pycache__  
  10. │   └───__pycache__
复制代码
如此,依赖和解释器就紧密结合在一起了,换台机器,并不需要安装也可以直接启动。
一键启动

现在,我们来编写一键启动脚本,launch.bat文件:
  1. @echo off  
  2. chcp 65001  
  3. @echo 开始运行  
  4. call .\python310\python.exe -m spleeter separate -p spleeter:2stems -o ./output ./test.mp3  
  5. call .\python310\python.exe ./infer.py --model ./ckpt/model_ckpt_steps_104000_simplified.ckpt --wav ./output/test/vocals.wav  
  6. @echo 处理完毕,请按任意键  
  7. call pause
复制代码
这里chcp命令用来声明编码,防止中文提示乱码。
call用来执行脚本,注意解释器必须使用项目内置的嵌入式解释器.\python310\python.exe
随后双击执行脚本launch.bat,程序返回:
[code]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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具