经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
一键整合,万用万灵,Python3.10项目嵌入式一键整合包的制作(Embed)
来源:cnblogs  作者:刘悦的技术博客  时间:2023/11/17 9:19:08  对本文有异议

我们知道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. # Uncomment to run site.main() automatically
  4. 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,程序返回:

  1. Active code page: 65001
  2. 开始运行
  3. INFO:spleeter:File ./output\test/vocals.wav written succesfully
  4. INFO:spleeter:File ./output\test/accompaniment.wav written succesfully
  5. 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,
  6. clip_grad_norm: 1, dataloader_prefetch_factor: 2, ddp_backend: nccl, ds_workers: 4, finetune_ckpt_path: None,
  7. finetune_enabled: False, finetune_ignored_params: [], finetune_strict_shapes: True, fmax: 8000, fmin: 40,
  8. 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},
  9. max_batch_frames: 80000, max_batch_size: 8, max_updates: 10000000, max_val_batch_frames: 10000, max_val_batch_size: 1,
  10. 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,
  11. 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,
  12. 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,
  13. permanent_ckpt_start: 200000, pl_trainer_accelerator: auto, pl_trainer_devices: auto, pl_trainer_num_nodes: 1, pl_trainer_precision: 32-true,
  14. pl_trainer_strategy: auto, raw_data_dir: [], rest_threshold: 0.1, sampler_frame_count_grid: 6, seed: 114514,
  15. sort_by_len: True, task_cls: training.MIDIExtractionTask, test_prefixes: None, train_set_name: train, units_dim: 80,
  16. 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,
  17. valid_set_name: valid, win_size: 2048
  18. | load 'model' from 'ckpt\model_ckpt_steps_104000_simplified.ckpt'.
  19. 100%|████████████████████████████████████████████████████████████████████████████████████| 2/2 [00:01<00:00, 1.88it/s]
  20. 处理完毕,请按任意键
  21. Press any key to continue . . .

可以看到,执行结果和传统终端执行的结果是一致的。

区别是使用者并不需要本地配置Python环境,只需要下载项目的整合包即可。

结语

通过嵌入式打包,可以把Python程序和解释器、依赖库一并打包分发给非专业用户,由此就提高了这部分用户群体的使用体验,最后奉上打包后的整合包,以飨众乡亲:

  1. 链接:https://pan.baidu.com/s/1HN3LAusdtofwqtb4gnSwvQ?pwd=72yq

原文链接:https://www.cnblogs.com/v3ucn/p/17836954.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号