pyxllib 0.3.96__py3-none-any.whl → 0.3.200__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. pyxllib/__init__.py +21 -21
  2. pyxllib/algo/__init__.py +8 -8
  3. pyxllib/algo/disjoint.py +54 -54
  4. pyxllib/algo/geo.py +541 -529
  5. pyxllib/algo/intervals.py +964 -964
  6. pyxllib/algo/matcher.py +389 -311
  7. pyxllib/algo/newbie.py +166 -166
  8. pyxllib/algo/pupil.py +629 -461
  9. pyxllib/algo/shapelylib.py +67 -67
  10. pyxllib/algo/specialist.py +241 -240
  11. pyxllib/algo/stat.py +494 -458
  12. pyxllib/algo/treelib.py +149 -149
  13. pyxllib/algo/unitlib.py +66 -66
  14. {pyxlpr → pyxllib/autogui}/__init__.py +5 -5
  15. pyxllib/autogui/activewin.py +246 -0
  16. pyxllib/autogui/all.py +9 -0
  17. pyxllib/{ext/autogui → autogui}/autogui.py +852 -823
  18. pyxllib/autogui/uiautolib.py +362 -0
  19. pyxllib/{ext/autogui → autogui}/virtualkey.py +102 -102
  20. pyxllib/autogui/wechat.py +827 -0
  21. pyxllib/autogui/wechat_msg.py +421 -0
  22. pyxllib/autogui/wxautolib.py +84 -0
  23. pyxllib/cv/__init__.py +5 -5
  24. pyxllib/cv/expert.py +267 -267
  25. pyxllib/cv/imfile.py +159 -159
  26. pyxllib/cv/imhash.py +39 -39
  27. pyxllib/cv/pupil.py +9 -9
  28. pyxllib/cv/rgbfmt.py +1525 -1525
  29. pyxllib/cv/slidercaptcha.py +137 -0
  30. pyxllib/cv/trackbartools.py +251 -251
  31. pyxllib/cv/xlcvlib.py +1040 -1040
  32. pyxllib/cv/xlpillib.py +423 -423
  33. pyxllib/data/echarts.py +240 -129
  34. pyxllib/data/jsonlib.py +89 -0
  35. pyxllib/data/oss.py +72 -72
  36. pyxllib/data/pglib.py +1127 -643
  37. pyxllib/data/sqlite.py +568 -341
  38. pyxllib/data/sqllib.py +297 -297
  39. pyxllib/ext/JLineViewer.py +505 -492
  40. pyxllib/ext/__init__.py +6 -6
  41. pyxllib/ext/demolib.py +246 -246
  42. pyxllib/ext/drissionlib.py +277 -0
  43. pyxllib/ext/kq5034lib.py +12 -1606
  44. pyxllib/ext/old.py +663 -663
  45. pyxllib/ext/qt.py +449 -449
  46. pyxllib/ext/robustprocfile.py +497 -0
  47. pyxllib/ext/seleniumlib.py +76 -76
  48. pyxllib/ext/tk.py +173 -173
  49. pyxllib/ext/unixlib.py +827 -826
  50. pyxllib/ext/utools.py +351 -338
  51. pyxllib/ext/webhook.py +124 -101
  52. pyxllib/ext/win32lib.py +40 -40
  53. pyxllib/ext/wjxlib.py +88 -0
  54. pyxllib/ext/wpsapi.py +124 -0
  55. pyxllib/ext/xlwork.py +9 -0
  56. pyxllib/ext/yuquelib.py +1105 -173
  57. pyxllib/file/__init__.py +17 -17
  58. pyxllib/file/docxlib.py +761 -761
  59. pyxllib/file/gitlib.py +309 -309
  60. pyxllib/file/libreoffice.py +165 -0
  61. pyxllib/file/movielib.py +148 -139
  62. pyxllib/file/newbie.py +10 -10
  63. pyxllib/file/onenotelib.py +1469 -1469
  64. pyxllib/file/packlib/__init__.py +330 -293
  65. pyxllib/file/packlib/zipfile.py +2441 -2441
  66. pyxllib/file/pdflib.py +426 -426
  67. pyxllib/file/pupil.py +185 -185
  68. pyxllib/file/specialist/__init__.py +685 -685
  69. pyxllib/file/specialist/dirlib.py +799 -799
  70. pyxllib/file/specialist/download.py +193 -186
  71. pyxllib/file/specialist/filelib.py +2829 -2618
  72. pyxllib/file/xlsxlib.py +3131 -2976
  73. pyxllib/file/xlsyncfile.py +341 -0
  74. pyxllib/prog/__init__.py +5 -5
  75. pyxllib/prog/cachetools.py +64 -0
  76. pyxllib/prog/deprecatedlib.py +233 -233
  77. pyxllib/prog/filelock.py +42 -0
  78. pyxllib/prog/ipyexec.py +253 -253
  79. pyxllib/prog/multiprogs.py +940 -0
  80. pyxllib/prog/newbie.py +451 -444
  81. pyxllib/prog/pupil.py +1197 -1128
  82. pyxllib/prog/sitepackages.py +33 -33
  83. pyxllib/prog/specialist/__init__.py +391 -217
  84. pyxllib/prog/specialist/bc.py +203 -200
  85. pyxllib/prog/specialist/browser.py +497 -488
  86. pyxllib/prog/specialist/common.py +347 -347
  87. pyxllib/prog/specialist/datetime.py +199 -131
  88. pyxllib/prog/specialist/tictoc.py +240 -241
  89. pyxllib/prog/specialist/xllog.py +180 -180
  90. pyxllib/prog/xlosenv.py +108 -101
  91. pyxllib/stdlib/__init__.py +17 -17
  92. pyxllib/stdlib/tablepyxl/__init__.py +10 -10
  93. pyxllib/stdlib/tablepyxl/style.py +303 -303
  94. pyxllib/stdlib/tablepyxl/tablepyxl.py +130 -130
  95. pyxllib/text/__init__.py +8 -8
  96. pyxllib/text/ahocorasick.py +39 -39
  97. pyxllib/text/airscript.js +744 -0
  98. pyxllib/text/charclasslib.py +121 -109
  99. pyxllib/text/jiebalib.py +267 -264
  100. pyxllib/text/jinjalib.py +32 -0
  101. pyxllib/text/jsa_ai_prompt.md +271 -0
  102. pyxllib/text/jscode.py +922 -767
  103. pyxllib/text/latex/__init__.py +158 -158
  104. pyxllib/text/levenshtein.py +303 -303
  105. pyxllib/text/nestenv.py +1215 -1215
  106. pyxllib/text/newbie.py +300 -288
  107. pyxllib/text/pupil/__init__.py +8 -8
  108. pyxllib/text/pupil/common.py +1121 -1095
  109. pyxllib/text/pupil/xlalign.py +326 -326
  110. pyxllib/text/pycode.py +47 -47
  111. pyxllib/text/specialist/__init__.py +8 -8
  112. pyxllib/text/specialist/common.py +112 -112
  113. pyxllib/text/specialist/ptag.py +186 -186
  114. pyxllib/text/spellchecker.py +172 -172
  115. pyxllib/text/templates/echart_base.html +11 -0
  116. pyxllib/text/templates/highlight_code.html +17 -0
  117. pyxllib/text/templates/latex_editor.html +103 -0
  118. pyxllib/text/vbacode.py +17 -17
  119. pyxllib/text/xmllib.py +747 -685
  120. pyxllib/xl.py +42 -38
  121. pyxllib/xlcv.py +17 -17
  122. pyxllib-0.3.200.dist-info/METADATA +48 -0
  123. pyxllib-0.3.200.dist-info/RECORD +126 -0
  124. {pyxllib-0.3.96.dist-info → pyxllib-0.3.200.dist-info}/WHEEL +1 -2
  125. {pyxllib-0.3.96.dist-info → pyxllib-0.3.200.dist-info/licenses}/LICENSE +190 -190
  126. pyxllib/ext/autogui/__init__.py +0 -8
  127. pyxllib-0.3.96.dist-info/METADATA +0 -51
  128. pyxllib-0.3.96.dist-info/RECORD +0 -333
  129. pyxllib-0.3.96.dist-info/top_level.txt +0 -2
  130. pyxlpr/ai/__init__.py +0 -5
  131. pyxlpr/ai/clientlib.py +0 -1281
  132. pyxlpr/ai/specialist.py +0 -286
  133. pyxlpr/ai/torch_app.py +0 -172
  134. pyxlpr/ai/xlpaddle.py +0 -655
  135. pyxlpr/ai/xltorch.py +0 -705
  136. pyxlpr/data/__init__.py +0 -11
  137. pyxlpr/data/coco.py +0 -1325
  138. pyxlpr/data/datacls.py +0 -365
  139. pyxlpr/data/datasets.py +0 -200
  140. pyxlpr/data/gptlib.py +0 -1291
  141. pyxlpr/data/icdar/__init__.py +0 -96
  142. pyxlpr/data/icdar/deteval.py +0 -377
  143. pyxlpr/data/icdar/icdar2013.py +0 -341
  144. pyxlpr/data/icdar/iou.py +0 -340
  145. pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -463
  146. pyxlpr/data/imtextline.py +0 -473
  147. pyxlpr/data/labelme.py +0 -866
  148. pyxlpr/data/removeline.py +0 -179
  149. pyxlpr/data/specialist.py +0 -57
  150. pyxlpr/eval/__init__.py +0 -85
  151. pyxlpr/paddleocr.py +0 -776
  152. pyxlpr/ppocr/__init__.py +0 -15
  153. pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -226
  154. pyxlpr/ppocr/data/__init__.py +0 -135
  155. pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -26
  156. pyxlpr/ppocr/data/imaug/__init__.py +0 -67
  157. pyxlpr/ppocr/data/imaug/copy_paste.py +0 -170
  158. pyxlpr/ppocr/data/imaug/east_process.py +0 -437
  159. pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -244
  160. pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -114
  161. pyxlpr/ppocr/data/imaug/label_ops.py +0 -789
  162. pyxlpr/ppocr/data/imaug/make_border_map.py +0 -184
  163. pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -106
  164. pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -126
  165. pyxlpr/ppocr/data/imaug/operators.py +0 -433
  166. pyxlpr/ppocr/data/imaug/pg_process.py +0 -906
  167. pyxlpr/ppocr/data/imaug/randaugment.py +0 -143
  168. pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -239
  169. pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -533
  170. pyxlpr/ppocr/data/imaug/sast_process.py +0 -777
  171. pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -17
  172. pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -120
  173. pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -168
  174. pyxlpr/ppocr/data/lmdb_dataset.py +0 -115
  175. pyxlpr/ppocr/data/pgnet_dataset.py +0 -104
  176. pyxlpr/ppocr/data/pubtab_dataset.py +0 -107
  177. pyxlpr/ppocr/data/simple_dataset.py +0 -372
  178. pyxlpr/ppocr/losses/__init__.py +0 -61
  179. pyxlpr/ppocr/losses/ace_loss.py +0 -52
  180. pyxlpr/ppocr/losses/basic_loss.py +0 -135
  181. pyxlpr/ppocr/losses/center_loss.py +0 -88
  182. pyxlpr/ppocr/losses/cls_loss.py +0 -30
  183. pyxlpr/ppocr/losses/combined_loss.py +0 -67
  184. pyxlpr/ppocr/losses/det_basic_loss.py +0 -208
  185. pyxlpr/ppocr/losses/det_db_loss.py +0 -80
  186. pyxlpr/ppocr/losses/det_east_loss.py +0 -63
  187. pyxlpr/ppocr/losses/det_pse_loss.py +0 -149
  188. pyxlpr/ppocr/losses/det_sast_loss.py +0 -121
  189. pyxlpr/ppocr/losses/distillation_loss.py +0 -272
  190. pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -140
  191. pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -113
  192. pyxlpr/ppocr/losses/rec_aster_loss.py +0 -99
  193. pyxlpr/ppocr/losses/rec_att_loss.py +0 -39
  194. pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -44
  195. pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -70
  196. pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -30
  197. pyxlpr/ppocr/losses/rec_sar_loss.py +0 -28
  198. pyxlpr/ppocr/losses/rec_srn_loss.py +0 -47
  199. pyxlpr/ppocr/losses/table_att_loss.py +0 -109
  200. pyxlpr/ppocr/metrics/__init__.py +0 -44
  201. pyxlpr/ppocr/metrics/cls_metric.py +0 -45
  202. pyxlpr/ppocr/metrics/det_metric.py +0 -82
  203. pyxlpr/ppocr/metrics/distillation_metric.py +0 -73
  204. pyxlpr/ppocr/metrics/e2e_metric.py +0 -86
  205. pyxlpr/ppocr/metrics/eval_det_iou.py +0 -274
  206. pyxlpr/ppocr/metrics/kie_metric.py +0 -70
  207. pyxlpr/ppocr/metrics/rec_metric.py +0 -75
  208. pyxlpr/ppocr/metrics/table_metric.py +0 -50
  209. pyxlpr/ppocr/modeling/architectures/__init__.py +0 -32
  210. pyxlpr/ppocr/modeling/architectures/base_model.py +0 -88
  211. pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -60
  212. pyxlpr/ppocr/modeling/backbones/__init__.py +0 -54
  213. pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -268
  214. pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -246
  215. pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -285
  216. pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -265
  217. pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -186
  218. pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -138
  219. pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -258
  220. pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -48
  221. pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -210
  222. pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -143
  223. pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -307
  224. pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -286
  225. pyxlpr/ppocr/modeling/heads/__init__.py +0 -54
  226. pyxlpr/ppocr/modeling/heads/cls_head.py +0 -52
  227. pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -118
  228. pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -121
  229. pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -37
  230. pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -128
  231. pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -253
  232. pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -206
  233. pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -163
  234. pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -393
  235. pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -202
  236. pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -88
  237. pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -826
  238. pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -402
  239. pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -280
  240. pyxlpr/ppocr/modeling/heads/self_attention.py +0 -406
  241. pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -246
  242. pyxlpr/ppocr/modeling/necks/__init__.py +0 -32
  243. pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -111
  244. pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -188
  245. pyxlpr/ppocr/modeling/necks/fpn.py +0 -138
  246. pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -314
  247. pyxlpr/ppocr/modeling/necks/rnn.py +0 -92
  248. pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -284
  249. pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -110
  250. pyxlpr/ppocr/modeling/transforms/__init__.py +0 -28
  251. pyxlpr/ppocr/modeling/transforms/stn.py +0 -135
  252. pyxlpr/ppocr/modeling/transforms/tps.py +0 -308
  253. pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -156
  254. pyxlpr/ppocr/optimizer/__init__.py +0 -61
  255. pyxlpr/ppocr/optimizer/learning_rate.py +0 -228
  256. pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -49
  257. pyxlpr/ppocr/optimizer/optimizer.py +0 -160
  258. pyxlpr/ppocr/optimizer/regularizer.py +0 -52
  259. pyxlpr/ppocr/postprocess/__init__.py +0 -55
  260. pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -33
  261. pyxlpr/ppocr/postprocess/db_postprocess.py +0 -234
  262. pyxlpr/ppocr/postprocess/east_postprocess.py +0 -143
  263. pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -200
  264. pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -52
  265. pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -15
  266. pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -29
  267. pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -14
  268. pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -118
  269. pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -654
  270. pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -355
  271. pyxlpr/ppocr/tools/__init__.py +0 -14
  272. pyxlpr/ppocr/tools/eval.py +0 -83
  273. pyxlpr/ppocr/tools/export_center.py +0 -77
  274. pyxlpr/ppocr/tools/export_model.py +0 -129
  275. pyxlpr/ppocr/tools/infer/predict_cls.py +0 -151
  276. pyxlpr/ppocr/tools/infer/predict_det.py +0 -300
  277. pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -169
  278. pyxlpr/ppocr/tools/infer/predict_rec.py +0 -414
  279. pyxlpr/ppocr/tools/infer/predict_system.py +0 -204
  280. pyxlpr/ppocr/tools/infer/utility.py +0 -629
  281. pyxlpr/ppocr/tools/infer_cls.py +0 -83
  282. pyxlpr/ppocr/tools/infer_det.py +0 -134
  283. pyxlpr/ppocr/tools/infer_e2e.py +0 -122
  284. pyxlpr/ppocr/tools/infer_kie.py +0 -153
  285. pyxlpr/ppocr/tools/infer_rec.py +0 -146
  286. pyxlpr/ppocr/tools/infer_table.py +0 -107
  287. pyxlpr/ppocr/tools/program.py +0 -596
  288. pyxlpr/ppocr/tools/test_hubserving.py +0 -117
  289. pyxlpr/ppocr/tools/train.py +0 -163
  290. pyxlpr/ppocr/tools/xlprog.py +0 -748
  291. pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -94
  292. pyxlpr/ppocr/utils/__init__.py +0 -24
  293. pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -117
  294. pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -162
  295. pyxlpr/ppocr/utils/dict/be_dict.txt +0 -145
  296. pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -140
  297. pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -8421
  298. pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -163
  299. pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -167
  300. pyxlpr/ppocr/utils/dict/en_dict.txt +0 -63
  301. pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -136
  302. pyxlpr/ppocr/utils/dict/french_dict.txt +0 -136
  303. pyxlpr/ppocr/utils/dict/german_dict.txt +0 -143
  304. pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -162
  305. pyxlpr/ppocr/utils/dict/it_dict.txt +0 -118
  306. pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -4399
  307. pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -153
  308. pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -3688
  309. pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -185
  310. pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -153
  311. pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -153
  312. pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -96
  313. pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -130
  314. pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -91
  315. pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -134
  316. pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -125
  317. pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -128
  318. pyxlpr/ppocr/utils/dict/table_dict.txt +0 -277
  319. pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -2759
  320. pyxlpr/ppocr/utils/dict/te_dict.txt +0 -151
  321. pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -114
  322. pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -142
  323. pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -137
  324. pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -110
  325. pyxlpr/ppocr/utils/dict90.txt +0 -90
  326. pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -574
  327. pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -83
  328. pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -87
  329. pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -457
  330. pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -592
  331. pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -162
  332. pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -162
  333. pyxlpr/ppocr/utils/en_dict.txt +0 -95
  334. pyxlpr/ppocr/utils/gen_label.py +0 -81
  335. pyxlpr/ppocr/utils/ic15_dict.txt +0 -36
  336. pyxlpr/ppocr/utils/iou.py +0 -54
  337. pyxlpr/ppocr/utils/logging.py +0 -69
  338. pyxlpr/ppocr/utils/network.py +0 -84
  339. pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -6623
  340. pyxlpr/ppocr/utils/profiler.py +0 -110
  341. pyxlpr/ppocr/utils/save_load.py +0 -150
  342. pyxlpr/ppocr/utils/stats.py +0 -72
  343. pyxlpr/ppocr/utils/utility.py +0 -80
  344. pyxlpr/ppstructure/__init__.py +0 -13
  345. pyxlpr/ppstructure/predict_system.py +0 -187
  346. pyxlpr/ppstructure/table/__init__.py +0 -13
  347. pyxlpr/ppstructure/table/eval_table.py +0 -72
  348. pyxlpr/ppstructure/table/matcher.py +0 -192
  349. pyxlpr/ppstructure/table/predict_structure.py +0 -136
  350. pyxlpr/ppstructure/table/predict_table.py +0 -221
  351. pyxlpr/ppstructure/table/table_metric/__init__.py +0 -16
  352. pyxlpr/ppstructure/table/table_metric/parallel.py +0 -51
  353. pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -247
  354. pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -13
  355. pyxlpr/ppstructure/table/tablepyxl/style.py +0 -283
  356. pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -118
  357. pyxlpr/ppstructure/utility.py +0 -71
  358. pyxlpr/xlai.py +0 -10
@@ -1,180 +1,180 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # @Author : 陈坤泽
4
- # @Email : 877362867@qq.com
5
- # @Date : 2020/09/18 22:16
6
-
7
- import os
8
- import concurrent.futures
9
- import math
10
- import time
11
- import sys
12
-
13
- from pyxllib.prog.pupil import EmptyPoolExecutor, format_exception
14
- from pyxllib.text.pupil import shorten
15
-
16
- XLLOG_CONF_FILE = 'xllog.yaml'
17
-
18
- ____xllog = """
19
- """
20
-
21
-
22
- def get_xllog(name='xllog', *, log_file=None):
23
- """ 获得pyxllib库的日志类
24
-
25
- :param log_file: 增加输出到一个日志文件,该功能仅在首次初始化时有效
26
- 注意这个是'w'机制,会删除之前的日志文件
27
- # TODO 这样的功能设计问题挺大的,工程逻辑很莫名其妙,有空要把日志功能修缮下
28
- # 例如一个通用的初始化类,然后xllog只是一个特定的实例日志类
29
-
30
- TODO 增加输出到钉钉机器人、邮箱的Handler?
31
- """
32
- import logging, coloredlogs
33
-
34
- # 1 判断是否已存在,直接返回
35
- if ('pyxllib.' + name) in logging.root.manager.loggerDict:
36
- return logging.getLogger('pyxllib.' + name)
37
-
38
- # 2 初次构建
39
- if name == 'xllog': # 附带运行时间信息
40
- if os.path.isfile(XLLOG_CONF_FILE):
41
- # 尝试在默认位置是否有自定义配置文件,读取配置文件来创建
42
- import logging.config
43
- from pyxllib.file.specialist import File
44
- data = File(XLLOG_CONF_FILE).read()
45
- if isinstance(data, dict):
46
- # 推荐使用yaml的字典结构,格式更简洁清晰
47
- logging.config.dictConfig(data)
48
- else:
49
- # 但是普通的conf配置文件也支持
50
- logging.config.fileConfig(XLLOG_CONF_FILE)
51
- else:
52
- # 3 否则生成一个非常简易版的xllog
53
- xllog = logging.getLogger('pyxllib.xllog')
54
- fmt = '%(asctime)s %(message)s'
55
- if log_file:
56
- # TODO 这里的格式设置是否能统一、精简?
57
- file_handler = logging.FileHandler(f'{log_file}', 'w')
58
- file_handler.setLevel(logging.DEBUG)
59
- file_handler.setFormatter(logging.Formatter(fmt))
60
- xllog.addHandler(file_handler)
61
- coloredlogs.install(level='DEBUG', logger=xllog, fmt=fmt)
62
- elif name == 'location': # 附带代码所处位置信息
63
- loclog = logging.getLogger('pyxllib.location')
64
- coloredlogs.install(level='DEBUG', logger=loclog, fmt='%(filename)s/%(lineno)d: %(message)s')
65
- return logging.getLogger('pyxllib.' + name)
66
-
67
-
68
- class Iterate:
69
- """ 迭代器类,用来封装一些特定模式的for循环操作
70
-
71
- TODO 双循环,需要内部两两对比的迭代功能
72
-
73
- 200920周日18:20,最初设计的时候,是提供run_pair、run_pair2的功能的
74
- 不过后来想想,这个其实就是排列组合,在itertools里有combinations, permutations可以代替
75
- 甚至有放回的组合也有combinations_with_replacement,我实在是不需要再这里写这些冗余的功能
76
- 所以就移除了
77
- """
78
-
79
- def __init__(self, items):
80
- # 没有总长度倒也能接受,关键是可能要用start、end切片,所以还是先转成tuple更方便操作
81
- self.items = tuple(items)
82
- self.n_items = len(self.items)
83
- self.format_width = math.ceil(math.log10(self.n_items + 1))
84
- self.xllog = get_xllog()
85
-
86
- def _format_pinterval(self, pinterval=None):
87
- if isinstance(pinterval, str) and pinterval.endswith('%'):
88
- # 百分比的情况,重算出间隔元素数
89
- return int(round(self.n_items * float(pinterval[:-1]) / 100))
90
- else: # 其他格式暂不解析,按原格式处理
91
- return pinterval
92
-
93
- def _step1_check_number(self, pinterval, func):
94
- if pinterval:
95
- sys.stdout.flush() # 让逻辑在前的标准输出先print出来,但其实这句也不一定能让print及时输出的~~可能会被日志提前抢输出了
96
- self.xllog.info(f"使用 {func.__name__} 处理 {self.n_items} 个数据 {shorten(str(self.items), 30)}")
97
-
98
- def _step2_check_range(self, start, end):
99
- if start:
100
- self.xllog.info(f"使用start参数,只处理≥{start}的条目")
101
- else:
102
- start = 0
103
- if end:
104
- # 这里空格是为了对齐,别删
105
- self.xllog.info(f"使用 end 参数,只处理<{end}的条目")
106
- else:
107
- end = len(self.items)
108
- return start, end
109
-
110
- def _step3_executor(self, pinterval, max_workers):
111
- if max_workers == 1:
112
- # workers=1,实际上并不用多线程,用一个假的多线程类代替,能大大提速
113
- executor = EmptyPoolExecutor()
114
- # executor = concurrent.futures.ThreadPoolExecutor(max_workers)
115
- else:
116
- executor = concurrent.futures.ThreadPoolExecutor(max_workers)
117
- if pinterval:
118
- self.xllog.info(f'多线程执行,当前迭代所用线程数:{executor._max_workers}')
119
- return executor
120
-
121
- def _step4_iter(self, i, pinterval, executor):
122
- # 队列中没有新任务时,才放入新任务,这样能确保pinterval的输出能反应实时情况,而不是一下全部进入队列,把for循环跑完了
123
- while executor._work_queue.qsize(): pass
124
- if pinterval and (i or pinterval == 1) and i % pinterval == 0:
125
- message = f' {self.items[i]}' if pinterval == 1 else ''
126
- self.xllog.info(f'{i:{self.format_width}d}/{self.n_items}={i / self.n_items:6.2%}{message}')
127
-
128
- def _step5_finish(self, pinterval, interrupt, start_time):
129
- from humanfriendly import format_timespan
130
- end_time = time.time()
131
- span = end_time - start_time
132
- if span:
133
- speed = self.n_items / span
134
- msg = f'总用时:{format_timespan(span)},速度:{speed:.2f}it/s'
135
- else:
136
- msg = f'总用时:{format_timespan(span)}'
137
- if not interrupt and pinterval:
138
- self.xllog.info(f'{self.n_items / self.n_items:6.2%} 完成迭代,{msg}')
139
- sys.stderr.flush()
140
-
141
- def run(self, func, start=0, end=None, pinterval=None, max_workers=1, interrupt=True):
142
- """
143
- :param func: 对每个item执行的功能
144
- :param start: 跳过<start的数据,只处理>=start编号以上
145
- :param end: 只处理 < end 的数据
146
- :param pinterval: 每隔多少条目输出进度日志,默认不输出进度日志(但是错误日志依然会输出)
147
- 支持按百分比进度显示,例如每20%,pinterval='20%',不过一些底层实现机制原因,会有些许误差
148
- TODO 支持按指定时间间隔显示? 例如每15秒,pinterval='15s' 感觉这种功能太花哨了,没必要搞
149
- :param max_workers: 默认线程数,默认1,即串行
150
- :type max_workers: int, None
151
- :param interrupt: 出现错误时是否中断,默认True会终止程序,否则只会输出错误日志
152
- :return:
153
- """
154
-
155
- # 1 统一的参数处理部分
156
- pinterval = self._format_pinterval(pinterval)
157
- self._step1_check_number(pinterval, func)
158
- start, end = self._step2_check_range(start, end)
159
- error = False
160
- executor = self._step3_executor(pinterval, max_workers)
161
-
162
- # 2 封装的子处理部分
163
- def wrap_func(func, i):
164
- nonlocal error
165
- item = self.items[i]
166
- try:
167
- func(item)
168
- except Exception as e:
169
- error = e
170
- self.xllog.error(f'💔idx={i}运行出错:{item}\n{format_exception(e)}')
171
-
172
- # 3 执行迭代
173
- start_time = time.time()
174
- for i in range(start, end):
175
- self._step4_iter(i, pinterval, executor)
176
- executor.submit(wrap_func, func, i)
177
- if interrupt and error:
178
- raise error
179
- executor.shutdown() # 必须等executor结束,error才是准确的
180
- self._step5_finish(pinterval, interrupt and error, start_time)
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2020/09/18 22:16
6
+
7
+ import os
8
+ import concurrent.futures
9
+ import math
10
+ import time
11
+ import sys
12
+
13
+ from pyxllib.prog.pupil import EmptyPoolExecutor, format_exception
14
+ from pyxllib.text.pupil import shorten
15
+
16
+ XLLOG_CONF_FILE = 'xllog.yaml'
17
+
18
+ ____xllog = """
19
+ """
20
+
21
+
22
+ def get_xllog(name='xllog', *, log_file=None):
23
+ """ 获得pyxllib库的日志类
24
+
25
+ :param log_file: 增加输出到一个日志文件,该功能仅在首次初始化时有效
26
+ 注意这个是'w'机制,会删除之前的日志文件
27
+ # TODO 这样的功能设计问题挺大的,工程逻辑很莫名其妙,有空要把日志功能修缮下
28
+ # 例如一个通用的初始化类,然后xllog只是一个特定的实例日志类
29
+
30
+ TODO 增加输出到钉钉机器人、邮箱的Handler?
31
+ """
32
+ # import logging, coloredlogs
33
+ import logging
34
+
35
+ # 1 判断是否已存在,直接返回
36
+ if ('pyxllib.' + name) in logging.root.manager.loggerDict:
37
+ return logging.getLogger('pyxllib.' + name)
38
+
39
+ # 2 初次构建
40
+ if name == 'xllog': # 附带运行时间信息
41
+ if os.path.isfile(XLLOG_CONF_FILE):
42
+ # 尝试在默认位置是否有自定义配置文件,读取配置文件来创建
43
+ import logging.config
44
+ from pyxllib.file.specialist import File
45
+ data = File(XLLOG_CONF_FILE).read()
46
+ if isinstance(data, dict):
47
+ # 推荐使用yaml的字典结构,格式更简洁清晰
48
+ logging.config.dictConfig(data)
49
+ else:
50
+ # 但是普通的conf配置文件也支持
51
+ logging.config.fileConfig(XLLOG_CONF_FILE)
52
+ else:
53
+ # 3 否则生成一个非常简易版的xllog
54
+ xllog = logging.getLogger('pyxllib.xllog')
55
+ fmt = '%(asctime)s %(message)s'
56
+ if log_file:
57
+ file_handler = logging.FileHandler(f'{log_file}', 'a')
58
+ file_handler.setLevel(logging.DEBUG)
59
+ file_handler.setFormatter(logging.Formatter(fmt))
60
+ xllog.addHandler(file_handler)
61
+ # coloredlogs.install(level='DEBUG', logger=xllog, fmt=fmt)
62
+ elif name == 'location': # 附带代码所处位置信息
63
+ loclog = logging.getLogger('pyxllib.location')
64
+ # coloredlogs.install(level='DEBUG', logger=loclog, fmt='%(filename)s/%(lineno)d: %(message)s')
65
+ return logging.getLogger('pyxllib.' + name)
66
+
67
+
68
+ class Iterate:
69
+ """ 迭代器类,用来封装一些特定模式的for循环操作
70
+
71
+ TODO 双循环,需要内部两两对比的迭代功能
72
+
73
+ 200920周日18:20,最初设计的时候,是提供run_pair、run_pair2的功能的
74
+ 不过后来想想,这个其实就是排列组合,在itertools里有combinations, permutations可以代替
75
+ 甚至有放回的组合也有combinations_with_replacement,我实在是不需要再这里写这些冗余的功能
76
+ 所以就移除了
77
+ """
78
+
79
+ def __init__(self, items):
80
+ # 没有总长度倒也能接受,关键是可能要用start、end切片,所以还是先转成tuple更方便操作
81
+ self.items = tuple(items)
82
+ self.n_items = len(self.items)
83
+ self.format_width = math.ceil(math.log10(self.n_items + 1))
84
+ self.xllog = get_xllog()
85
+
86
+ def _format_pinterval(self, pinterval=None):
87
+ if isinstance(pinterval, str) and pinterval.endswith('%'):
88
+ # 百分比的情况,重算出间隔元素数
89
+ return int(round(self.n_items * float(pinterval[:-1]) / 100))
90
+ else: # 其他格式暂不解析,按原格式处理
91
+ return pinterval
92
+
93
+ def _step1_check_number(self, pinterval, func):
94
+ if pinterval:
95
+ sys.stdout.flush() # 让逻辑在前的标准输出先print出来,但其实这句也不一定能让print及时输出的~~可能会被日志提前抢输出了
96
+ self.xllog.info(f"使用 {func.__name__} 处理 {self.n_items} 个数据 {shorten(str(self.items), 30)}")
97
+
98
+ def _step2_check_range(self, start, end):
99
+ if start:
100
+ self.xllog.info(f"使用start参数,只处理≥{start}的条目")
101
+ else:
102
+ start = 0
103
+ if end:
104
+ # 这里空格是为了对齐,别删
105
+ self.xllog.info(f"使用 end 参数,只处理<{end}的条目")
106
+ else:
107
+ end = len(self.items)
108
+ return start, end
109
+
110
+ def _step3_executor(self, pinterval, max_workers):
111
+ if max_workers == 1:
112
+ # workers=1,实际上并不用多线程,用一个假的多线程类代替,能大大提速
113
+ executor = EmptyPoolExecutor()
114
+ # executor = concurrent.futures.ThreadPoolExecutor(max_workers)
115
+ else:
116
+ executor = concurrent.futures.ThreadPoolExecutor(max_workers)
117
+ if pinterval:
118
+ self.xllog.info(f'多线程执行,当前迭代所用线程数:{executor._max_workers}')
119
+ return executor
120
+
121
+ def _step4_iter(self, i, pinterval, executor):
122
+ # 队列中没有新任务时,才放入新任务,这样能确保pinterval的输出能反应实时情况,而不是一下全部进入队列,把for循环跑完了
123
+ while executor._work_queue.qsize(): pass
124
+ if pinterval and (i or pinterval == 1) and i % pinterval == 0:
125
+ message = f' {self.items[i]}' if pinterval == 1 else ''
126
+ self.xllog.info(f'{i:{self.format_width}d}/{self.n_items}={i / self.n_items:6.2%}{message}')
127
+
128
+ def _step5_finish(self, pinterval, interrupt, start_time):
129
+ from humanfriendly import format_timespan
130
+ end_time = time.time()
131
+ span = end_time - start_time
132
+ if span:
133
+ speed = self.n_items / span
134
+ msg = f'总用时:{format_timespan(span)},速度:{speed:.2f}it/s'
135
+ else:
136
+ msg = f'总用时:{format_timespan(span)}'
137
+ if not interrupt and pinterval:
138
+ self.xllog.info(f'{self.n_items / self.n_items:6.2%} 完成迭代,{msg}')
139
+ sys.stderr.flush()
140
+
141
+ def run(self, func, start=0, end=None, pinterval=None, max_workers=1, interrupt=True):
142
+ """
143
+ :param func: 对每个item执行的功能
144
+ :param start: 跳过<start的数据,只处理>=start编号以上
145
+ :param end: 只处理 < end 的数据
146
+ :param pinterval: 每隔多少条目输出进度日志,默认不输出进度日志(但是错误日志依然会输出)
147
+ 支持按百分比进度显示,例如每20%,pinterval='20%',不过一些底层实现机制原因,会有些许误差
148
+ TODO 支持按指定时间间隔显示? 例如每15秒,pinterval='15s' 感觉这种功能太花哨了,没必要搞
149
+ :param max_workers: 默认线程数,默认1,即串行
150
+ :type max_workers: int, None
151
+ :param interrupt: 出现错误时是否中断,默认True会终止程序,否则只会输出错误日志
152
+ :return:
153
+ """
154
+
155
+ # 1 统一的参数处理部分
156
+ pinterval = self._format_pinterval(pinterval)
157
+ self._step1_check_number(pinterval, func)
158
+ start, end = self._step2_check_range(start, end)
159
+ error = False
160
+ executor = self._step3_executor(pinterval, max_workers)
161
+
162
+ # 2 封装的子处理部分
163
+ def wrap_func(func, i):
164
+ nonlocal error
165
+ item = self.items[i]
166
+ try:
167
+ func(item)
168
+ except Exception as e:
169
+ error = e
170
+ self.xllog.error(f'💔idx={i}运行出错:{item}\n{format_exception(e)}')
171
+
172
+ # 3 执行迭代
173
+ start_time = time.time()
174
+ for i in range(start, end):
175
+ self._step4_iter(i, pinterval, executor)
176
+ executor.submit(wrap_func, func, i)
177
+ if interrupt and error:
178
+ raise error
179
+ executor.shutdown() # 必须等executor结束,error才是准确的
180
+ self._step5_finish(pinterval, interrupt and error, start_time)
pyxllib/prog/xlosenv.py CHANGED
@@ -1,101 +1,108 @@
1
- import os
2
- import json
3
- import base64
4
-
5
- from pyxllib.text.newbie import add_quote
6
-
7
-
8
- class XlOsEnv:
9
- """ pyxllib库自带的一套环境变量数据解析类
10
-
11
- 会将json的字符串值,或者普通str,存储到环境变量中
12
-
13
- 环境变量也可以用来实现全局变量的信息传递,虽然不太建议这样做
14
-
15
- >> XlOsEnv.persist_set('TP10_ACCOUNT',
16
- {'server': '172.16.250.250', 'port': 22, 'user': 'ckz', 'passwd': '123456'},
17
- True)
18
- >> print(XlOsEnv.get('TP10_ACCOUNT'), True) # 展示存储的账号信息
19
- eyJzZXJ2ZXIiOiAiMTcyLjE2LjE3MC4xMzQiLCAicG9ydCI6IDIyLCAidXNlciI6ICJjaGVua3VuemUiLCAicGFzc3dkIjogImNvZGV4bHByIn0=
20
- >> XlOsEnv.unset('TP10_ACCOUNT')
21
- """
22
-
23
- @classmethod
24
- def get(cls, name, *, decoding=False):
25
- """ 获取环境变量值
26
-
27
- :param name: 环境变量名
28
- :param decoding: 是否需要先进行base64解码
29
- :return:
30
- 返回json解析后的数据
31
- 或者普通的字符串值
32
- """
33
- value = os.getenv(name, None)
34
- if value is None:
35
- return value
36
-
37
- if decoding:
38
- value = base64.b64decode(value.encode())
39
-
40
- try:
41
- return json.loads(value)
42
- except json.decoder.JSONDecodeError:
43
- if isinstance(value, bytes):
44
- return value.decode()
45
- else:
46
- return value
47
-
48
- @classmethod
49
- def set(cls, name, value, encoding=False):
50
- """ 临时改变环境变量
51
-
52
- :param name: 环境变量名
53
- :param value: 要存储的值
54
- :param encoding: 是否将内容转成base64后,再存储环境变量
55
- 防止一些密码信息,明文写出来太容易泄露
56
- 不过这个策略也很容易被破解;只防君子,难防小人
57
-
58
- 当然,谁看到这有闲情功夫的话,可以考虑做一套更复杂的加密系统
59
- 并且encoding支持多种不同的解加密策略,这样单看环境变量值就很难破译了
60
- :return: str, 最终存储的字符串内容
61
- """
62
- # 1 打包
63
- if isinstance(value, str):
64
- value = add_quote(value)
65
- else:
66
- value = json.dumps(value)
67
-
68
- # 2 编码
69
- if encoding:
70
- value = base64.b64encode(value.encode()).decode()
71
-
72
- # 3 存储到环境变量
73
- os.environ[name] = value
74
-
75
- return value
76
-
77
- @classmethod
78
- def persist_set(cls, name, value, encoding=False, *, cfgfile=None):
79
- """ python里默认是改不了系统变量的,需要使用一些特殊手段
80
- https://stackoverflow.com/questions/17657686/is-it-possible-to-set-an-environment-variable-from-python-permanently/17657905
81
-
82
- :param cfgfile: 在linux系统时,可以使用该参数
83
- 默认是把环境变量写入 ~/.bashrc,可以考虑写到
84
- TODO 有这个设想,但很不好实现,不是很关键的功能,所以还未开发
85
-
86
- """
87
- # 写入环境变量这里是有点小麻烦的,要考虑unix和windows不同平台,以及怎么持久化存储的问题,这里直接调用一个三方库来解决
88
- from envariable import setenv
89
-
90
- value = cls.set(name, value, encoding)
91
- if value[0] == value[-1] == '"':
92
- value = '\\' + value + '\\'
93
- setenv(name, value)
94
-
95
- return value
96
-
97
- @classmethod
98
- def unset(cls, name):
99
- """ 删除环境变量 """
100
- from envariable import unsetenv
101
- unsetenv(name)
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2024/10/30
6
+
7
+
8
+ import os
9
+ import json
10
+ import base64
11
+
12
+ from pyxllib.text.newbie import add_quote
13
+
14
+
15
+ class XlOsEnv:
16
+ """ pyxllib库自带的一套环境变量数据解析类
17
+
18
+ 会将json的字符串值,或者普通str,存储到环境变量中
19
+
20
+ 环境变量也可以用来实现全局变量的信息传递,虽然不太建议这样做
21
+
22
+ >> XlOsEnv.persist_set('TP10_ACCOUNT',
23
+ {'server': '172.16.250.250', 'port': 22, 'user': 'ckz', 'passwd': '123456'},
24
+ True)
25
+ >> print(XlOsEnv.get('TP10_ACCOUNT'), True) # 展示存储的账号信息
26
+ eyJzZXJ2ZXIiOiAiMTcyLjE2LjE3MC4xMzQiLCAicG9ydCI6IDIyLCAidXNlciI6ICJjaGVua3VuemUiLCAicGFzc3dkIjogImNvZGV4bHByIn0=
27
+ >> XlOsEnv.unset('TP10_ACCOUNT')
28
+ """
29
+
30
+ @classmethod
31
+ def get(cls, name, *, decoding=False):
32
+ """ 获取环境变量值
33
+
34
+ :param name: 环境变量名
35
+ :param decoding: 是否需要先进行base64解码
36
+ :return:
37
+ 返回json解析后的数据
38
+ 或者普通的字符串值
39
+ """
40
+ value = os.getenv(name, None)
41
+ if value is None:
42
+ return value
43
+
44
+ if decoding:
45
+ value = base64.b64decode(value.encode())
46
+
47
+ try:
48
+ return json.loads(value)
49
+ except json.decoder.JSONDecodeError:
50
+ if isinstance(value, bytes):
51
+ return value.decode()
52
+ else:
53
+ return value
54
+
55
+ @classmethod
56
+ def set(cls, name, value, encoding=False):
57
+ """ 临时改变环境变量
58
+
59
+ :param name: 环境变量名
60
+ :param value: 要存储的值
61
+ :param encoding: 是否将内容转成base64后,再存储环境变量
62
+ 防止一些密码信息,明文写出来太容易泄露
63
+ 不过这个策略也很容易被破解;只防君子,难防小人
64
+
65
+ 当然,谁看到这有闲情功夫的话,可以考虑做一套更复杂的加密系统
66
+ 并且encoding支持多种不同的解加密策略,这样单看环境变量值就很难破译了
67
+ :return: str, 最终存储的字符串内容
68
+ """
69
+ # 1 打包
70
+ if isinstance(value, str):
71
+ value = add_quote(value)
72
+ else:
73
+ value = json.dumps(value)
74
+
75
+ # 2 编码
76
+ if encoding:
77
+ value = base64.b64encode(value.encode()).decode()
78
+
79
+ # 3 存储到环境变量
80
+ os.environ[name] = value
81
+
82
+ return value
83
+
84
+ @classmethod
85
+ def persist_set(cls, name, value, encoding=False, *, cfgfile=None):
86
+ """ python里默认是改不了系统变量的,需要使用一些特殊手段
87
+ https://stackoverflow.com/questions/17657686/is-it-possible-to-set-an-environment-variable-from-python-permanently/17657905
88
+
89
+ :param cfgfile: 在linux系统时,可以使用该参数
90
+ 默认是把环境变量写入 ~/.bashrc,可以考虑写到
91
+ TODO 有这个设想,但很不好实现,不是很关键的功能,所以还未开发
92
+
93
+ """
94
+ # 写入环境变量这里是有点小麻烦的,要考虑unix和windows不同平台,以及怎么持久化存储的问题,这里直接调用一个三方库来解决
95
+ from envariable import setenv
96
+
97
+ value = cls.set(name, value, encoding)
98
+ if value[0] == value[-1] == '"':
99
+ value = '\\' + value + '\\'
100
+ setenv(name, value)
101
+
102
+ return value
103
+
104
+ @classmethod
105
+ def unset(cls, name):
106
+ """ 删除环境变量 """
107
+ from envariable import unsetenv
108
+ unsetenv(name)
@@ -1,17 +1,17 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # @Author : 陈坤泽
4
- # @Email : 877362867@qq.com
5
- # @Date : 2021/01/13 15:29
6
-
7
- """
8
- 对标准库或一些第三方库,进行的功能扩展
9
- 也有可能对一些bug进行了修改
10
-
11
- 有些是小的库,直接把源码搬过来了
12
- 有些是较大的库,仍然要(会自动在需要使用时 pip install)安装
13
-
14
- 改了底层标准库一些功能,修复一些bug,或者提升功能兼容性、强度
15
-
16
- onepy: 做了些中文注解,其他修改了啥我也忘了~~可能是有改源码功能的
17
- """
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2021/01/13 15:29
6
+
7
+ """
8
+ 对标准库或一些第三方库,进行的功能扩展
9
+ 也有可能对一些bug进行了修改
10
+
11
+ 有些是小的库,直接把源码搬过来了
12
+ 有些是较大的库,仍然要(会自动在需要使用时 pip install)安装
13
+
14
+ 改了底层标准库一些功能,修复一些bug,或者提升功能兼容性、强度
15
+
16
+ onepy: 做了些中文注解,其他修改了啥我也忘了~~可能是有改源码功能的
17
+ """
@@ -1,10 +1,10 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # @Author : 陈坤泽
4
- # @Email : 877362867@qq.com
5
- # @Date : 2020/06/02 20:00
6
-
7
-
8
- """
9
- from https://github.com/martsberger/tablepyxl
10
- """
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2020/06/02 20:00
6
+
7
+
8
+ """
9
+ from https://github.com/martsberger/tablepyxl
10
+ """