pyxllib 0.3.115__tar.gz → 0.3.117__tar.gz
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.
- {pyxllib-0.3.115/pyxllib.egg-info → pyxllib-0.3.117}/PKG-INFO +2 -1
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/algo/pupil.py +7 -4
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/algo/stat.py +1 -1
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/data/sqlite.py +15 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/file/specialist/filelib.py +45 -8
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/file/xlsxlib.py +14 -2
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/prog/cachetools.py +2 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/prog/pupil.py +153 -12
- pyxllib-0.3.117/pyxllib/prog/scheduler.py +129 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117/pyxllib.egg-info}/PKG-INFO +2 -1
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib.egg-info/SOURCES.txt +1 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib.egg-info/requires.txt +20 -5
- {pyxllib-0.3.115 → pyxllib-0.3.117}/setup.py +11 -4
- {pyxllib-0.3.115 → pyxllib-0.3.117}/LICENSE +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/MANIFEST.in +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/README.md +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/algo/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/algo/disjoint.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/algo/geo.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/algo/intervals.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/algo/matcher.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/algo/newbie.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/algo/shapelylib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/algo/specialist.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/algo/treelib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/algo/unitlib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/cv/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/cv/expert.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/cv/imfile.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/cv/imhash.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/cv/pupil.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/cv/rgbfmt.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/cv/trackbartools.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/cv/xlcvlib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/cv/xlpillib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/data/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/data/echarts.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/data/jsonlib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/data/oss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/data/pglib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/data/sqllib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/ext/JLineViewer.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/ext/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/ext/autogui/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/ext/autogui/autogui.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/ext/autogui/virtualkey.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/ext/demolib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/ext/drissionlib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/ext/kq5034lib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/ext/old.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/ext/qt.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/ext/robustprocfile.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/ext/seleniumlib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/ext/tk.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/ext/unixlib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/ext/utools.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/ext/webhook.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/ext/win32lib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/ext/yuquelib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/file/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/file/docxlib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/file/gitlib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/file/libreoffice.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/file/movielib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/file/newbie.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/file/onenotelib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/file/packlib/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/file/packlib/zipfile.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/file/pdflib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/file/pupil.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/file/specialist/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/file/specialist/dirlib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/file/specialist/download.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/prog/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/prog/deprecatedlib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/prog/ipyexec.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/prog/multiprocs.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/prog/newbie.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/prog/sitepackages.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/prog/specialist/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/prog/specialist/bc.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/prog/specialist/browser.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/prog/specialist/common.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/prog/specialist/datetime.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/prog/specialist/tictoc.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/prog/specialist/xllog.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/prog/xlosenv.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/stdlib/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/stdlib/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/stdlib/tablepyxl/style.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/stdlib/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/ahocorasick.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/charclasslib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/jiebalib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/jinjalib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/jscode.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/latex/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/levenshtein.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/nestenv.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/newbie.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/pupil/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/pupil/common.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/pupil/xlalign.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/pycode.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/specialist/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/specialist/common.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/specialist/ptag.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/spellchecker.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/vbacode.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/text/xmllib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/xl.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib/xlcv.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib.egg-info/dependency_links.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxllib.egg-info/top_level.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ai/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ai/clientlib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ai/specialist.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ai/torch_app.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ai/xlpaddle.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ai/xltorch.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/data/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/data/coco.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/data/datacls.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/data/datasets.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/data/gptlib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/data/icdar/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/data/icdar/deteval.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/data/icdar/icdar2013.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/data/icdar/iou.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/data/imtextline.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/data/labelme.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/data/removeline.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/data/specialist.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/data/tiktokenlib.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/eval/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/paddleocr.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/copy_paste.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/east_process.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/label_ops.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/make_border_map.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/operators.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/pg_process.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/randaugment.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/sast_process.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/lmdb_dataset.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/pgnet_dataset.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/pubtab_dataset.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/data/simple_dataset.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/ace_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/basic_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/center_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/cls_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/combined_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/det_basic_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/det_db_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/det_east_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/det_pse_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/det_sast_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/distillation_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/rec_aster_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/rec_att_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/rec_sar_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/rec_srn_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/losses/table_att_loss.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/metrics/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/metrics/cls_metric.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/metrics/det_metric.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/metrics/distillation_metric.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/metrics/e2e_metric.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/metrics/eval_det_iou.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/metrics/kie_metric.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/metrics/rec_metric.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/metrics/table_metric.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/architectures/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/architectures/base_model.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/backbones/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/heads/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/heads/cls_head.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/heads/self_attention.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/necks/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/necks/fpn.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/necks/rnn.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/transforms/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/transforms/stn.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/transforms/tps.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/optimizer/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/optimizer/learning_rate.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/optimizer/optimizer.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/optimizer/regularizer.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/postprocess/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/postprocess/db_postprocess.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/postprocess/east_postprocess.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/eval.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/export_center.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/export_model.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/infer/predict_cls.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/infer/predict_det.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/infer/predict_rec.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/infer/predict_system.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/infer/utility.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/infer_cls.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/infer_det.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/infer_e2e.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/infer_kie.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/infer_rec.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/infer_table.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/program.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/test_hubserving.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/train.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/tools/xlprog.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/be_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/en_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/french_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/german_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/it_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/table_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/te_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/dict90.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/en_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/gen_label.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/ic15_dict.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/iou.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/logging.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/network.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/profiler.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/save_load.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/stats.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppocr/utils/utility.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppstructure/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppstructure/predict_system.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppstructure/table/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppstructure/table/eval_table.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppstructure/table/matcher.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppstructure/table/predict_structure.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppstructure/table/predict_table.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppstructure/table/table_metric/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppstructure/table/table_metric/parallel.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppstructure/table/tablepyxl/style.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/ppstructure/utility.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/pyxlpr/xlai.py +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/requirements.txt +0 -0
- {pyxllib-0.3.115 → pyxllib-0.3.117}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: pyxllib
|
3
|
-
Version: 0.3.
|
3
|
+
Version: 0.3.117
|
4
4
|
Summary: 厦门理工模式识别团队通用python代码工具库
|
5
5
|
Home-page: https://github.com/XLPRUtils/pyxllib
|
6
6
|
Author: code4101
|
@@ -15,6 +15,7 @@ Requires-Python: >=3.6
|
|
15
15
|
Description-Content-Type: text/markdown
|
16
16
|
Provides-Extra: xlcv
|
17
17
|
Provides-Extra: xlai
|
18
|
+
Provides-Extra: xlall
|
18
19
|
License-File: LICENSE
|
19
20
|
|
20
21
|
# 1 install
|
@@ -455,9 +455,10 @@ def matchpairs(xs, ys, cmp_func, least_score=sys.float_info.epsilon, *,
|
|
455
455
|
def get_number_width(n):
|
456
456
|
""" 判断数值n的长度
|
457
457
|
|
458
|
+
参考资料:https://jstrieb.github.io/posts/digit-length/
|
459
|
+
|
458
460
|
>>> get_number_width(0)
|
459
|
-
|
460
|
-
AssertionError
|
461
|
+
1
|
461
462
|
>>> get_number_width(9)
|
462
463
|
1
|
463
464
|
>>> get_number_width(10)
|
@@ -465,8 +466,10 @@ def get_number_width(n):
|
|
465
466
|
>>> get_number_width(97)
|
466
467
|
2
|
467
468
|
"""
|
468
|
-
assert n > 0
|
469
|
-
return math.ceil(math.log10(n + 1))
|
469
|
+
# assert n > 0
|
470
|
+
# return math.ceil(math.log10(n + 1))
|
471
|
+
|
472
|
+
return 1 if n == 0 else (math.floor(math.log10(n)) + 1)
|
470
473
|
|
471
474
|
|
472
475
|
class SearchBase:
|
@@ -449,7 +449,7 @@ def print_full_dataframe(df):
|
|
449
449
|
'display.max_colwidth', None):
|
450
450
|
print(df)
|
451
451
|
|
452
|
-
pd.options
|
452
|
+
pd.options.display.max_rows = 60
|
453
453
|
|
454
454
|
|
455
455
|
def custom_fillna(df, default_fill_value='', numeric_fill_value=None, specific_fill=None):
|
@@ -90,6 +90,8 @@ class SqlBuilder:
|
|
90
90
|
|
91
91
|
:param desc: 例如 'id%2=1'
|
92
92
|
"""
|
93
|
+
if not desc:
|
94
|
+
return
|
93
95
|
column, divisor_remainder = desc.split('%')
|
94
96
|
divisor, remainder = map(int, divisor_remainder.split('='))
|
95
97
|
return self.where_mod(column, divisor, remainder)
|
@@ -364,6 +366,19 @@ class SqlBase:
|
|
364
366
|
f'UPDATE {table_name} SET {kvs} WHERE {ops}',
|
365
367
|
self.cvt_types(vals))
|
366
368
|
|
369
|
+
def delete_row(self, table_name, where, *, commit=False):
|
370
|
+
""" 【删】删除数据
|
371
|
+
|
372
|
+
:param dict where: 怎么匹配到对应记录
|
373
|
+
:param commit: 建议减小commit频率,会极大降低性能
|
374
|
+
:return:
|
375
|
+
"""
|
376
|
+
ops = ' AND '.join([f'{k}=%s' for k in where.keys()])
|
377
|
+
vals = list(where.values())
|
378
|
+
self.commit_base(commit,
|
379
|
+
f'DELETE FROM {table_name} WHERE {ops}',
|
380
|
+
self.cvt_types(vals))
|
381
|
+
|
367
382
|
def select_col(self, table_name, col):
|
368
383
|
""" 获得一列数据,常使用的功能,所以做了一个封装
|
369
384
|
|
@@ -887,6 +887,7 @@ class XlPath(type(pathlib.Path())):
|
|
887
887
|
return 0
|
888
888
|
|
889
889
|
def mtime(self):
|
890
|
+
""" 文件的修改时间 """
|
890
891
|
# windows会带小数,linux使用%Ts只有整数部分。
|
891
892
|
# 这里不用四舍五入,取整数部分就是对应的。
|
892
893
|
return int(os.stat(self).st_mtime)
|
@@ -1287,6 +1288,7 @@ class XlPath(type(pathlib.Path())):
|
|
1287
1288
|
|
1288
1289
|
def write_auto(self, data, *args, if_exists=None, **kwargs):
|
1289
1290
|
""" 根据文件后缀自动识别写入函数 """
|
1291
|
+
self.parent.mkdir(exist_ok=True, parents=True)
|
1290
1292
|
mode = self.suffix.lower()[1:]
|
1291
1293
|
write_func = getattr(self, 'write_' + mode, None)
|
1292
1294
|
if self.exist_preprcs(if_exists):
|
@@ -2283,8 +2285,11 @@ class PathGroups(Groups):
|
|
2283
2285
|
return ls
|
2284
2286
|
|
2285
2287
|
|
2286
|
-
def cache_file(file, make_data_func: Callable[[], Any] = None, *,
|
2287
|
-
|
2288
|
+
def cache_file(file, make_data_func: Callable[[], Any] = None, *,
|
2289
|
+
mode='read_first',
|
2290
|
+
cache_time=None,
|
2291
|
+
**kwargs):
|
2292
|
+
""" 能将局部函数功能结果缓存进文件的功能
|
2288
2293
|
|
2289
2294
|
输入的文件file如果存在则直接读取内容;
|
2290
2295
|
否则用make_data_func生成,并且备份一个file文件
|
@@ -2292,20 +2297,52 @@ def cache_file(file, make_data_func: Callable[[], Any] = None, *, reset=False, *
|
|
2292
2297
|
:param file: 需要缓存的文件路径
|
2293
2298
|
:param make_data_func: 如果文件不存在,则需要生成一份,要提供数据生成函数
|
2294
2299
|
cache_file可以当装饰器用,此时不用显式指定该参数
|
2295
|
-
:param
|
2300
|
+
:param mode:
|
2301
|
+
read_first(默认): 优先尝试从已有文件读取
|
2302
|
+
generate_first: 函数生成优先
|
2303
|
+
:param cache_time: 文件缓存时间,单位为秒,默认为None,表示始终使用缓存文件
|
2304
|
+
如果设置60,表示超过60秒后,需要重新优先从函数获得更新内容
|
2296
2305
|
:param kwargs: 可以传递read、write支持的扩展参数
|
2297
|
-
:return:
|
2306
|
+
:return: 读取到的数据
|
2298
2307
|
"""
|
2308
|
+
from datetime import datetime, timedelta
|
2309
|
+
from pyxllib.prog.pupil import format_exception
|
2299
2310
|
|
2300
2311
|
def decorator(func):
|
2301
2312
|
def wrapper(*args2, **kwargs2):
|
2313
|
+
|
2302
2314
|
f = XlPath.init(file, XlPath.tempdir())
|
2303
|
-
|
2304
|
-
|
2305
|
-
|
2315
|
+
f.parent.mkdir(exist_ok=True, parents=True)
|
2316
|
+
|
2317
|
+
# 1 优先看是不是需要先从文件读取数据
|
2318
|
+
if mode == 'read_first' and f.is_file():
|
2319
|
+
if cache_time is None:
|
2320
|
+
return f.read_auto(**kwargs)
|
2321
|
+
|
2322
|
+
current_time = datetime.now()
|
2323
|
+
last_modified = datetime.fromtimestamp(f.mtime()) # 获取文件的修改时间
|
2324
|
+
if not isinstance(cache_time, timedelta):
|
2325
|
+
cache_time2 = timedelta(seconds=cache_time)
|
2326
|
+
else:
|
2327
|
+
cache_time2 = cache_time
|
2328
|
+
|
2329
|
+
if cache_time is None or (current_time - last_modified <= cache_time2):
|
2330
|
+
return f.read_auto(**kwargs)
|
2331
|
+
|
2332
|
+
# 2 如果需要重新生成数据,且没有已存在的保底文件
|
2333
|
+
if not f.is_file():
|
2306
2334
|
data = func(*args2, **kwargs2)
|
2307
2335
|
f.write_auto(data, **kwargs)
|
2308
|
-
|
2336
|
+
return data
|
2337
|
+
|
2338
|
+
# 3 需要重新生成,但是有保底文件
|
2339
|
+
try:
|
2340
|
+
data = func(*args2, **kwargs2)
|
2341
|
+
f.write_auto(data, **kwargs)
|
2342
|
+
return data
|
2343
|
+
except Exception as e:
|
2344
|
+
print(format_exception(e))
|
2345
|
+
return f.read_auto(**kwargs)
|
2309
2346
|
|
2310
2347
|
return wrapper
|
2311
2348
|
|
@@ -36,6 +36,7 @@ from openpyxl import Workbook
|
|
36
36
|
from openpyxl.cell.cell import MergedCell
|
37
37
|
from openpyxl.styles import Font, Alignment
|
38
38
|
from openpyxl.utils.cell import get_column_letter, column_index_from_string
|
39
|
+
import openpyxl.worksheet.formula
|
39
40
|
import pandas as pd
|
40
41
|
|
41
42
|
try:
|
@@ -518,7 +519,7 @@ def is_string_type(value):
|
|
518
519
|
try:
|
519
520
|
pd.to_datetime(value, errors='raise')
|
520
521
|
return False
|
521
|
-
except (ValueError, TypeError, OverflowError):
|
522
|
+
except (ValueError, TypeError, OverflowError, AttributeError):
|
522
523
|
pass
|
523
524
|
|
524
525
|
# 检查是否为浮点数类型
|
@@ -573,10 +574,18 @@ class XlCell(openpyxl.cell.cell.Cell): # 适用于 openpyxl.cell.cell.MergedCel
|
|
573
574
|
|
574
575
|
TODO 这个函数还是可以看看能不能有更好的实现、提速
|
575
576
|
"""
|
577
|
+
|
578
|
+
def try_offset(x, y):
|
579
|
+
try:
|
580
|
+
return isinstance(self.offset(x, y), MergedCell)
|
581
|
+
except ValueError:
|
582
|
+
# 有可能会越界:ValueError: Row numbers must be between 1 and 1048576
|
583
|
+
return False
|
584
|
+
|
576
585
|
_type, status = 0, {}
|
577
586
|
if isinstance(self, MergedCell):
|
578
587
|
_type = 1
|
579
|
-
elif
|
588
|
+
elif try_offset(1, 0) or try_offset(0, 1):
|
580
589
|
# 这里只能判断可能是合并单元格,具体是不是合并单元格,还要
|
581
590
|
rng = self.in_range()
|
582
591
|
status['rng'] = rng
|
@@ -761,7 +770,10 @@ class XlCell(openpyxl.cell.cell.Cell): # 适用于 openpyxl.cell.cell.MergedCel
|
|
761
770
|
注意,遇到公式是很难计算处理的,大概率只能保持原公式显示
|
762
771
|
因为日期用的比较多,需要时常获得真实的渲染效果,所以这里封装一个接口
|
763
772
|
"""
|
773
|
+
|
764
774
|
x = self.value
|
775
|
+
if isinstance(x, openpyxl.worksheet.formula.ArrayFormula): # 数组公式要特别渲染
|
776
|
+
return x.text
|
765
777
|
xl_fmt = self.get_number_format()
|
766
778
|
return xl_render_value(x, xl_fmt)
|
767
779
|
|
@@ -24,6 +24,8 @@ from cached_property import cached_property_with_ttl # 限时缓存,单位秒
|
|
24
24
|
from cached_property import threaded_cached_property_with_ttl # 线程 + 限时
|
25
25
|
|
26
26
|
|
27
|
+
# todo 240609周日21:19 https://github.com/awolverp/cachebox,据说这个缓存库速度更快的多
|
28
|
+
|
27
29
|
# 进一步封装的更通用、自己常用的装饰器
|
28
30
|
|
29
31
|
def xlcache(maxsize=128, *, ttl=None, lock=None, property=False):
|
@@ -555,6 +555,9 @@ class Timeout:
|
|
555
555
|
return wrapper
|
556
556
|
|
557
557
|
def __enter__(self):
|
558
|
+
if self.seconds == 0: # 可以设置0来关闭超时功能
|
559
|
+
return
|
560
|
+
|
558
561
|
def overtime(signum, frame):
|
559
562
|
raise TimeoutError(f'with 上下文代码块运行超时 > [{self.seconds} 秒]')
|
560
563
|
|
@@ -568,6 +571,9 @@ class Timeout:
|
|
568
571
|
self.alarm.start()
|
569
572
|
|
570
573
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
574
|
+
if self.seconds == 0:
|
575
|
+
return
|
576
|
+
|
571
577
|
# with已经运行完了,马上关闭警告器
|
572
578
|
self.alarm.cancel()
|
573
579
|
|
@@ -973,30 +979,93 @@ class OutputLogger(logging.Logger):
|
|
973
979
|
self.print(msg)
|
974
980
|
|
975
981
|
|
982
|
+
class ProcessWorker:
|
983
|
+
""" 代表一个单独的工作进程 """
|
984
|
+
|
985
|
+
def __init__(self, name, process, port=None, locations=None,
|
986
|
+
raw_cmd=None):
|
987
|
+
"""
|
988
|
+
|
989
|
+
:param name: 进程昵称
|
990
|
+
:param process: 进程对象
|
991
|
+
:param port: 是否有执行所在端口
|
992
|
+
:param locations: 是否有url地址映射,一般用于nginx等配置
|
993
|
+
"""
|
994
|
+
self.name = name
|
995
|
+
self.process = process
|
996
|
+
self.port = port
|
997
|
+
self.locations = locations
|
998
|
+
self.raw_cmd = raw_cmd
|
999
|
+
|
1000
|
+
def terminate(self):
|
1001
|
+
""" 比较优雅结束进程的方法 """
|
1002
|
+
if self.process is not None:
|
1003
|
+
self.process.terminate()
|
1004
|
+
|
1005
|
+
def kill(self):
|
1006
|
+
""" 有时候需要强硬的kill方法来结束进程 """
|
1007
|
+
if self.process is not None:
|
1008
|
+
self.process.kill()
|
1009
|
+
|
1010
|
+
|
976
1011
|
class MultiProcessLauncher:
|
977
1012
|
""" 注意这个类暂时只有linux能使用 """
|
978
1013
|
|
979
1014
|
def __init__(self):
|
980
1015
|
self.workers = []
|
981
1016
|
|
982
|
-
def add_process_cmd(self,
|
1017
|
+
def add_process_cmd(self,
|
1018
|
+
cmd,
|
1019
|
+
name=None,
|
1020
|
+
shell=False,
|
1021
|
+
**kwargs):
|
1022
|
+
"""
|
1023
|
+
|
1024
|
+
:param shell: 默认直接跟系统交互,此时cmd应该输入数组格式
|
1025
|
+
如果shell=True,则启用shell进行交互操作,这种情况会更适合管道等模式的处理,此时cmd应该输入字符串格式
|
1026
|
+
|
1027
|
+
"""
|
983
1028
|
if name is None:
|
984
|
-
|
1029
|
+
cmd2 = cmd.split() if isinstance(cmd, str) else cmd
|
1030
|
+
name = cmd2[0]
|
1031
|
+
|
1032
|
+
proc = subprocess.Popen(cmd,
|
1033
|
+
shell=shell,
|
1034
|
+
preexec_fn=self._set_pdeathsig())
|
985
1035
|
|
986
|
-
|
987
|
-
worker = {'name': name, 'process': p, 'command': cmd}
|
988
|
-
worker.update(kwargs)
|
1036
|
+
worker = ProcessWorker(name, proc, raw_cmd=cmd, **kwargs)
|
989
1037
|
self.workers.append(worker)
|
1038
|
+
return worker
|
1039
|
+
|
1040
|
+
def add_process_python(self, file, args='', name=None, shell=False):
|
1041
|
+
""" 添加并启动一个Python模块作为后台进程。
|
1042
|
+
|
1043
|
+
:param file: 要执行的Python文件路径
|
1044
|
+
:param str|list args: 模块的参数
|
1045
|
+
:param name: 进程的名称,默认为模块名
|
1046
|
+
"""
|
1047
|
+
cmd = [f'{sys.executable}', f'{file}']
|
1048
|
+
if isinstance(args, str):
|
1049
|
+
cmd.append(args)
|
1050
|
+
else:
|
1051
|
+
cmd += list(args)
|
1052
|
+
|
1053
|
+
return self.add_process_cmd(cmd, name, shell=shell)
|
990
1054
|
|
991
|
-
def add_process_python_module(self, module, args='', name=None):
|
1055
|
+
def add_process_python_module(self, module, args='', name=None, shell=False):
|
992
1056
|
""" 添加并启动一个Python模块作为后台进程。
|
993
1057
|
|
994
1058
|
:param module: 要执行的Python模块名(python -m 后面的部分)
|
995
|
-
:param args: 模块的参数
|
1059
|
+
:param str|list args: 模块的参数
|
996
1060
|
:param name: 进程的名称,默认为模块名
|
997
1061
|
"""
|
998
|
-
cmd = f'{sys.executable} -m {module}
|
999
|
-
|
1062
|
+
cmd = [f'{sys.executable}', '-m', f'{module}']
|
1063
|
+
if isinstance(args, str):
|
1064
|
+
cmd.append(args)
|
1065
|
+
else:
|
1066
|
+
cmd += list(args)
|
1067
|
+
|
1068
|
+
return self.add_process_cmd(cmd, name, shell=shell)
|
1000
1069
|
|
1001
1070
|
def stop_all(self):
|
1002
1071
|
""" 停止所有后台进程 """
|
@@ -1004,14 +1073,84 @@ class MultiProcessLauncher:
|
|
1004
1073
|
worker.process.terminate()
|
1005
1074
|
self.workers = []
|
1006
1075
|
|
1007
|
-
def _set_pdeathsig(self, sig=
|
1076
|
+
def _set_pdeathsig(self, sig=None):
|
1008
1077
|
""" 在主服务退出时,这些进程也会全部自动关闭 """
|
1009
1078
|
|
1010
1079
|
def callable():
|
1080
|
+
import signal
|
1081
|
+
sig2 = signal.SIGTERM if sig is None else sig
|
1011
1082
|
libc = ctypes.CDLL("libc.so.6")
|
1012
|
-
return libc.prctl(1,
|
1083
|
+
return libc.prctl(1, sig2)
|
1084
|
+
|
1085
|
+
if sys.platform == 'win32':
|
1086
|
+
# windows系统暂设为空
|
1087
|
+
return None
|
1088
|
+
else:
|
1089
|
+
return callable
|
1090
|
+
|
1091
|
+
def run_endless(self):
|
1092
|
+
""" 一直运行,直到用户输入kill命令
|
1093
|
+
|
1094
|
+
poll:
|
1095
|
+
如果进程仍在运行,poll()方法返回None。
|
1096
|
+
如果进程已经结束,poll()方法返回进程的退出码(exit code)。
|
1097
|
+
如果进程正常结束,退出码通常为0。
|
1098
|
+
如果进程异常结束,退出码通常是一个非零值,表示异常的类型或错误码。
|
1099
|
+
"""
|
1100
|
+
import pandas as pd
|
1101
|
+
from pyxllib.algo.stat import print_full_dataframe
|
1102
|
+
|
1103
|
+
while True:
|
1104
|
+
cmd = input('>>>')
|
1105
|
+
if cmd == 'kill':
|
1106
|
+
self.stop_all()
|
1107
|
+
break
|
1108
|
+
elif cmd == 'count':
|
1109
|
+
# 需要实际检查现有进程
|
1110
|
+
m = sum([1 for worker in self.workers if worker.process.poll() is None])
|
1111
|
+
print(f'有{m}个进程正在运行')
|
1112
|
+
elif cmd == 'list': # 列出所有进程(转df查看)
|
1113
|
+
ls = []
|
1114
|
+
for worker in self.workers:
|
1115
|
+
ls.append([worker.name, worker.process.pid, worker.process.poll(), worker.raw_cmd])
|
1116
|
+
df = pd.DataFrame(ls, columns=['name', 'pid', 'poll', 'args'])
|
1117
|
+
print_full_dataframe(df)
|
1118
|
+
|
1119
|
+
|
1120
|
+
def support_multi_processes(default_processes=1):
|
1121
|
+
""" 对函数进行扩展,支持并发多进程运行
|
1122
|
+
|
1123
|
+
注意被装饰的函数,需要支持 process_count、process_id 两个参数,来获得总进程数,当前进程id的信息
|
1124
|
+
"""
|
1013
1125
|
|
1014
|
-
|
1126
|
+
def decorator(func):
|
1127
|
+
|
1128
|
+
def wrapper(*args, **kwargs):
|
1129
|
+
process_count = int(kwargs.pop('process_count', default_processes))
|
1130
|
+
process_id = kwargs.pop('process_id', None)
|
1131
|
+
|
1132
|
+
if process_count == 1 or process_id is not None:
|
1133
|
+
if process_id is None:
|
1134
|
+
return func(*args, **kwargs)
|
1135
|
+
else:
|
1136
|
+
return func(*args, **kwargs, process_count=process_count, process_id=process_id)
|
1137
|
+
else:
|
1138
|
+
mpl = MultiProcessLauncher()
|
1139
|
+
for i in range(int(process_count)):
|
1140
|
+
cmds = [func.__name__,
|
1141
|
+
'--process_count', str(process_count),
|
1142
|
+
'--process_id', str(i)
|
1143
|
+
]
|
1144
|
+
cmds.extend(map(str, args)) # 添加位置参数
|
1145
|
+
for k, v in kwargs.items():
|
1146
|
+
cmds.append(f'--{k}') # 添加关键字参数的键
|
1147
|
+
cmds.append(str(v)) # 添加关键字参数的值
|
1148
|
+
mpl.add_process_python(sys.argv[0], cmds)
|
1149
|
+
mpl.run_endless()
|
1150
|
+
|
1151
|
+
return wrapper
|
1152
|
+
|
1153
|
+
return decorator
|
1015
1154
|
|
1016
1155
|
|
1017
1156
|
def xlmd5(content):
|
@@ -1096,6 +1235,8 @@ def safe_div(a, b):
|
|
1096
1235
|
|
1097
1236
|
def inplace_decorate(parent, func_name, wrapper):
|
1098
1237
|
""" 将指定的函数替换为装饰器版本
|
1238
|
+
允许在运行时动态地将一个函数或方法替换为其装饰版本。通常用于添加日志、性能测试、事务处理等。
|
1239
|
+
(既然可以写成装饰版本,相当于其实要完全替换成另外的函数也是可以的)
|
1099
1240
|
|
1100
1241
|
当然,因为py一切皆对象,这里处理的不是函数,而是其他变量等对象也是可以的
|
1101
1242
|
|
@@ -0,0 +1,129 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
# @Author : 陈坤泽
|
4
|
+
# @Email : 877362867@qq.com
|
5
|
+
# @Date : 2024/06/18
|
6
|
+
|
7
|
+
|
8
|
+
from pyxllib.prog.pupil import check_install_package
|
9
|
+
|
10
|
+
check_install_package('croniter')
|
11
|
+
|
12
|
+
import datetime
|
13
|
+
import time
|
14
|
+
import sys
|
15
|
+
|
16
|
+
from croniter import croniter
|
17
|
+
|
18
|
+
|
19
|
+
class SchedulerUtils:
|
20
|
+
@classmethod
|
21
|
+
def calculate_future_time(cls, start_time, wait_seconds):
|
22
|
+
""" 计算延迟时间
|
23
|
+
|
24
|
+
:param datetime start_time: 开始时间
|
25
|
+
:param int wait_seconds: 等待秒数
|
26
|
+
todo 先只支持秒数这种标准秒数,后续可以考虑支持更多智能的"1小时"等这种解析
|
27
|
+
"""
|
28
|
+
return start_time + datetime.timedelta(seconds=wait_seconds)
|
29
|
+
|
30
|
+
@classmethod
|
31
|
+
def calculate_next_cron_time(cls, cron_tag, base_time=None):
|
32
|
+
""" 使用crontab标记的运行周期,然后计算相对当前时间,下一次要启动运行的时间
|
33
|
+
|
34
|
+
:param str cron_tag:
|
35
|
+
30 2 * * 1: 这部分是时间和日期的设定,具体含义如下:
|
36
|
+
30: 表示分钟,即每小时的第 30 分钟。
|
37
|
+
2: 表示小时,即凌晨 2 点。
|
38
|
+
第三个星号 *: 表示日,这里的星号意味着每天。
|
39
|
+
第四个星号 *: 表示月份,星号同样表示每个月。
|
40
|
+
1: 表示星期中的日子,这里的 1 代表星期一。
|
41
|
+
"""
|
42
|
+
|
43
|
+
# 如果没有提供基准时间,则使用当前时间
|
44
|
+
if base_time is None:
|
45
|
+
base_time = datetime.datetime.now()
|
46
|
+
# 初始化 croniter 对象
|
47
|
+
cron = croniter(cron_tag, base_time)
|
48
|
+
# 计算下一次运行时间
|
49
|
+
next_time = cron.get_next(datetime.datetime)
|
50
|
+
return next_time
|
51
|
+
|
52
|
+
@classmethod
|
53
|
+
def wait_until_time(cls, dst_time):
|
54
|
+
"""
|
55
|
+
:param datetime dst_time: 一直等待到目标时间
|
56
|
+
期间可以用time.sleep进行等待
|
57
|
+
"""
|
58
|
+
# 一般来说,只要计算一轮待等待秒数就行。但是time.sleep机制好像不一定准确的,所以使用无限循环重试会更好。
|
59
|
+
while True:
|
60
|
+
# 先计算当前时间和目标时间的相差秒数
|
61
|
+
wait_seconds = (dst_time - datetime.datetime.now()).total_seconds()
|
62
|
+
if wait_seconds <= 0:
|
63
|
+
break
|
64
|
+
time.sleep(max(1, wait_seconds)) # 最少等待1秒
|
65
|
+
|
66
|
+
@classmethod
|
67
|
+
def smart_wait(cls, start_time, end_time, wait_tag, print_mode=0):
|
68
|
+
""" 智能等待,一般用在对进程的管理重启上
|
69
|
+
|
70
|
+
:param datetime start_time: 程序启动的时间
|
71
|
+
:param datetime end_time: 程序结束的时间
|
72
|
+
:param str|float|int wait_tag: 等待标记
|
73
|
+
如果是str,则按照crontab解析
|
74
|
+
如果是int,则表示等待的秒数
|
75
|
+
如果是float,则表示等待的秒数
|
76
|
+
"""
|
77
|
+
# 1 尝试把wait_tag转成数值
|
78
|
+
try:
|
79
|
+
wait_tag = float(wait_tag)
|
80
|
+
except ValueError: # 转不成也没关系
|
81
|
+
pass
|
82
|
+
|
83
|
+
if start_time is None:
|
84
|
+
start_time = datetime.datetime.now()
|
85
|
+
if end_time is None:
|
86
|
+
end_time = datetime.datetime.now()
|
87
|
+
|
88
|
+
# 2 计算下一次启动时间
|
89
|
+
if isinstance(wait_tag, str):
|
90
|
+
# 按照crontab解析
|
91
|
+
next_time = cls.calculate_next_cron_time(wait_tag, end_time)
|
92
|
+
elif wait_tag >= 0:
|
93
|
+
# 正值则是从end_time开始往后等待
|
94
|
+
next_time = cls.calculate_future_time(end_time, wait_tag)
|
95
|
+
elif wait_tag < 0:
|
96
|
+
# 负值则是从start_time开始往前等待
|
97
|
+
next_time = cls.calculate_future_time(start_time, wait_tag)
|
98
|
+
else:
|
99
|
+
raise ValueError
|
100
|
+
|
101
|
+
if print_mode:
|
102
|
+
print(f'等待到时间{next_time}...')
|
103
|
+
|
104
|
+
cls.wait_until_time(next_time)
|
105
|
+
|
106
|
+
|
107
|
+
def trial():
|
108
|
+
# 设置基准时间
|
109
|
+
base_time = datetime.datetime.now()
|
110
|
+
# 定义crontab表达式
|
111
|
+
cron_expression = '30 2 * * 1' # 每周一凌晨2点30分执行
|
112
|
+
# 测试延迟功能
|
113
|
+
delayed_time = SchedulerUtils.calculate_future_time(base_time, 10) # 延迟10秒
|
114
|
+
# 测试crontab计算下一次运行时间
|
115
|
+
next_run_time = SchedulerUtils.calculate_next_cron_time(cron_expression, base_time)
|
116
|
+
|
117
|
+
print(base_time, delayed_time, next_run_time, sep='\n')
|
118
|
+
|
119
|
+
|
120
|
+
if __name__ == '__main__':
|
121
|
+
import fire
|
122
|
+
|
123
|
+
# 1 如果输入命令行参数,使用fire机制运行
|
124
|
+
if len(sys.argv) > 1:
|
125
|
+
fire.Fire()
|
126
|
+
exit()
|
127
|
+
|
128
|
+
# 2 否则执行这里的测试代码
|
129
|
+
trial()
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: pyxllib
|
3
|
-
Version: 0.3.
|
3
|
+
Version: 0.3.117
|
4
4
|
Summary: 厦门理工模式识别团队通用python代码工具库
|
5
5
|
Home-page: https://github.com/XLPRUtils/pyxllib
|
6
6
|
Author: code4101
|
@@ -15,6 +15,7 @@ Requires-Python: >=3.6
|
|
15
15
|
Description-Content-Type: text/markdown
|
16
16
|
Provides-Extra: xlcv
|
17
17
|
Provides-Extra: xlai
|
18
|
+
Provides-Extra: xlall
|
18
19
|
License-File: LICENSE
|
19
20
|
|
20
21
|
# 1 install
|
@@ -21,14 +21,29 @@ Jinja2
|
|
21
21
|
pandas>=0.23.4
|
22
22
|
|
23
23
|
[xlai]
|
24
|
-
|
25
|
-
pillow
|
26
|
-
opencv-python
|
24
|
+
pynvml
|
27
25
|
opsdroid-get-image-size
|
26
|
+
opencv-python
|
27
|
+
pillow
|
28
28
|
xlcocotools
|
29
|
-
|
29
|
+
visdom
|
30
30
|
|
31
|
-
[
|
31
|
+
[xlall]
|
32
|
+
flask-cors
|
33
|
+
html2text
|
34
|
+
ujson
|
35
|
+
flask-wtf
|
36
|
+
sentencepiece
|
37
|
+
flask-jwt-extended
|
38
|
+
flask
|
32
39
|
opsdroid-get-image-size
|
40
|
+
opencv-python
|
41
|
+
flask-restful
|
33
42
|
pillow
|
43
|
+
zhconv
|
44
|
+
xlrd
|
45
|
+
|
46
|
+
[xlcv]
|
47
|
+
pillow
|
48
|
+
opsdroid-get-image-size
|
34
49
|
opencv-python
|
@@ -28,18 +28,23 @@ xlcocotools
|
|
28
28
|
|
29
29
|
# 全量的依赖,自用
|
30
30
|
xlall = """
|
31
|
+
flask
|
32
|
+
flask-cors
|
31
33
|
xlrd
|
32
|
-
|
33
|
-
|
34
|
+
flask-wtf
|
35
|
+
flask-restful
|
34
36
|
zhconv
|
35
37
|
sentencepiece
|
38
|
+
ujson
|
39
|
+
html2text
|
40
|
+
flask-jwt-extended
|
36
41
|
"""
|
37
42
|
|
38
43
|
_dir = Path(__file__).parent
|
39
44
|
|
40
45
|
setup(
|
41
46
|
name='pyxllib', # pip 安装时用的名字
|
42
|
-
version='0.3.
|
47
|
+
version='0.3.117', # 当前版本,每次更新上传到pypi都需要修改; 第4位版本号一般是修紧急bug
|
43
48
|
author='code4101',
|
44
49
|
author_email='877362867@qq.com',
|
45
50
|
url='https://github.com/XLPRUtils/pyxllib',
|
@@ -67,5 +72,7 @@ setup(
|
|
67
72
|
# ①静态版:pip install pyxllib[xlcv]
|
68
73
|
# ②开发版:python setup.py develop easy_install pyxllib[xlcv]
|
69
74
|
extras_require={'xlcv': '\n'.join(set((xlcv).splitlines())),
|
70
|
-
'xlai': '\n'.join(set((xlcv + xlai).splitlines()))
|
75
|
+
'xlai': '\n'.join(set((xlcv + xlai).splitlines())),
|
76
|
+
'xlall': '\n'.join(set((xlcv + xlall).splitlines())),
|
77
|
+
},
|
71
78
|
)
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|