Skip to main content

pyutilb: python common utilities code

Project description

GitHub | Gitee

pyutilb - 通用工具类代码

这是我平时积累的工具类,有以下几个模块

1. util: 通用方法

from pyutilb.util import *

# 变量存在ThreadLocal中,是线程安全的
# 写变量
set_var('name', 'shi')
# 读变量
v = get_var('name')
# 替换变量: 将 $变量名 或 ${变量表达式} 替换为 变量值
v = replace_var("hello $name")

3. file: 文件读写,如 read_yaml() 支持读取本地或http的yaml文件

from pyutilb.file import *

# 写文本文件
write_file(file, content, append = False)
# 读文本文件
data = read_file(file)
# 写二进制文件
write_byte_file(file, content, append = False)
# 读二进制文件
data = read_byte_file(file)
# 读远程文件
data = read_http_file(url)
# 本地或远程的文本文件
data = read_local_or_http_file(file)
# 读文本文件
data = read_yaml(yaml_file)
# 读json文件, 支持本地或远程文件
data = read_json(json_file)
# 用pandas读csv文件
data = read_csv(csv_file)
# 用pandas读excel文件
data = read_excel(excel_file, sheet_name)
# 读本地或远端url返回的json/yaml形式的变量
data = read_vars(url)

4. log: 通用日志

from pyutilb.log import log

log.info('hello world')

5. cmd: 同步或异步执行命令

from pyutilb.cmd import *

step_files, option = parse_cmd('AppiumBoot', meta['version'])

6. strs: 字符串操作

from pyutilb.strs import *

str = 'hello world'
print(substr_before(str, ' '))
print(substr_after(str, ' '))

output = '''Linux 5.10.60-amd64-desktop (shi-PC) 	2023年04月23日 	_x86_64_	(6 CPU)

11时28分27秒   UID      TGID       TID    %usr %system  %guest   %wait    %CPU   CPU  Command
11时28分27秒  1000      9702         -   19.37    0.50    0.00    0.00   19.87     0  java
11时28分27秒  1000         -      9702    0.00    0.00    0.00    0.00    0.00     0  |__java
'''
print(substr_after_lines(output, 2))

7. ts: 时间转换

from pyutilb.ts import *

# 今天
print(today()) # 纯日期
print(today(True)) # 日期+时间
# 迭代指定范围内的日期, 范围为天数
for date in iterate_date_round(round=3):
    print(date)
# 迭代指定范围内的日期, 范围为天数, 倒序
for date in iterate_date_round(round=-3, step=-1):
    print(date)
# 迭代指定范围内的日期, 范围为首尾日期
end_date = today() + datetime.timedelta(days=3)
for date in iterate_date_between(end_date=end_date):
    print(date)
# 迭代指定范围内的日期, 范围为首尾日期, 倒序
end_date = today() + datetime.timedelta(days=-3)
for date in iterate_date_between(end_date=end_date, step=-1):
    print(date)

8. ocr_baidu/ocr_youdao: ocr图像识别

4. yaml_boot: 抽取几个boot框架(HttpBoot/SeleniumBoot/AppiumBoot/MiniumBoot/ExcelBoot/MonitorBoot/K8sBoot)的基类

5. var_parser: 解析boot框架的yaml脚本中引用的变量

6. threadlocal: 封装ThreadLocal

from pyutilb.threadlocal import ThreadLocal

num = ThreadLocal()
print(num.get())
def task(arg):
    num.set(arg)
    print(num.get())
for i in range(10):
    t = Thread(target=task, args=(i,))
    t.start()

7. atomic: 封装AtomicInteger/AtomicStarter

from pyutilb.atomic import *

# 线程安全的递增
ai = AtomicInteger()
print(ai.inc())
print(ai.dec())

# 一次性处理
def test():
    print('只调用一次')
ast = AtomicStarter()
ast.start_once(test)

8. asyncio_threadpool: 封装执行协程的线程池

import threading
import asyncio
import time
from pyutilb import EventLoopThreadPool

async def test(i):  # 测试的阻塞函数
    print(f'call test({i})')
    await asyncio.sleep(1)
    # time.sleep(1)
    name = threading.current_thread().name
    print(f"current thread: {name}; i = {i}")

pool = EventLoopThreadPool(3)
for i in range(0, 40):
    pool.exec(test(i))
    # pool.exec(test, i)
time.sleep(4)
print("over")
pool.shutdown()

8. asyncio_apscheduler_thread: 封装运行event loop的定时器线程

import threading
import time
from pyutilb import SchedulerThread

def create_job(msg):  # 测试的阻塞函数
    def job():
        name = threading.current_thread()
        print(f"thread [{name}] trigger job: {msg}")

    return job

t = SchedulerThread()
# 添加定时任务
#t.add_cron_job("0 */1 * * * *", create_job("每隔1分"))
t.add_cron_job("0 */1 14 * * *", create_job("2点内每隔1分"))
# t.add_cron_job("*/1 * * * * *", create_job("每隔1秒"))
t.add_cron_job("15 * * * * *", create_job("指定15秒"))
t.add_cron_job("0 51 * * * * *", create_job("指定51分"))

job1 = t.add_cron_job("*/1 * * * * *", create_job("每隔1秒, 但2秒后删除"), id="plan1")
job2 = t.add_cron_job("*/1 * * * * *", create_job("每隔1秒, 但3秒后删除"))

# 删除
time.sleep(2)
print("删除job1: " + job1.id)
t.scheduler.remove_job(job1.id)

time.sleep(1)
print("删除job2: " + job2.id)
job2.remove()

time.sleep(10000)

9. lazy: 封装延迟创建的属性

from pyutilb.lazy import lazyproperty

class Man(object):

    @lazyproperty
    def address(self):
        return 'xxx.yyy.zzz'

9. tail: 使用协程实现类似 linux 的tail功能,可以订阅文件内容的增加

from pyutilb.tail import Tail

t = Tail("/home/shi/test/a.txt")
async def print_msg(msg):
    await asyncio.sleep(0.1)
    name = threading.current_thread() # MainThread
    print(f"thread [{name}] 捕获一行:{msg}")
t.follow(print_msg)

10. zkfile: 基于zookeeper实现的远程配置文件

设计理念

  1. 数据层面:为了更好的融入k8s架构,远端配置文件的目录结构必须遵循k8s的层次结构,必包含两层:1 命名空间 2 应用;因此zookeeper上目录结构大致如下:
jkcfig
  default # k8s命名空间
    app1 # 应用
      redis.yaml # 配置文件
      log4j.properties
    app2 # 应用
      redis.yaml # 配置文件
      log4j.properties

注:仅支持 properties/yaml/yml/json 4种后缀的配置文件

  1. 数据管理层面:结合 jkcfg 在zookeeper上做配置管理,生成对应的目录结构

  2. 应用端层面:就是本文ZkConfigFiles的实现,用来实时加载远端配置,即是从zookeeper(远端)中获得(当前k8s命名空间+应用)目录下的配置文件

使用

import time
from pyutilb.zkfile.zkconfigfiles import ZkConfigFiles

# zookeeper服务地址
zk_host = '10.106.113.218:2181'

# 实例化ZkConfigFiles, 他会从远端(zookeeper)加载配置文件, 需要3个参数: 1 zk_hosts: zookeeper服务地址 2 namespace: k8s命名空间 3 name: 当前应用名
files = ZkConfigFiles(zk_host, 'default', 'rpcserver')  # 加载zookeeper中路径/jkcfg/default/rpcserver 下的配置文件
file = 'redis.yml'
config = files.get_zk_config(file)  # 加载zookeeper中路径为/jkcfg/default/rpcserver/redis.yml 的配置文件
config.add_config_listener(lambda data: print(f"监听到配置[{file}]变更: {data}"))
while True:
    print(config['host'])  # 读配置文件中host配置项的值
    time.sleep(3)

11. template: 渲染模板

from pyutilb.template import *

tpl = '<title>${title}</title>'
print(render_text(tpl, {'title': 'hero'}))

file = '/root/test.html'
print(render_file(file, {'title': 'hero'}))

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyutilb-1.0.7.tar.gz (48.0 kB view details)

Uploaded Source

Built Distribution

pyutilb-1.0.7-py3-none-any.whl (55.7 kB view details)

Uploaded Python 3

File details

Details for the file pyutilb-1.0.7.tar.gz.

File metadata

  • Download URL: pyutilb-1.0.7.tar.gz
  • Upload date:
  • Size: 48.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.8.12

File hashes

Hashes for pyutilb-1.0.7.tar.gz
Algorithm Hash digest
SHA256 dcce0edf81768b2f27b6f310924d77547904ac212caf70afe63a9a6c99ec7cdf
MD5 c9ebdee4deffbec576622397b5298cb2
BLAKE2b-256 63bc1ebf2c3225994b72aa3605468911da5d111ba80a60e8ce3d25b3cfbb403d

See more details on using hashes here.

File details

Details for the file pyutilb-1.0.7-py3-none-any.whl.

File metadata

  • Download URL: pyutilb-1.0.7-py3-none-any.whl
  • Upload date:
  • Size: 55.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.8.12

File hashes

Hashes for pyutilb-1.0.7-py3-none-any.whl
Algorithm Hash digest
SHA256 cc55095446ea7561f51d66ed7da370a3b539b97c8b897be57fd755214187895e
MD5 1768d7f82b9af9dfd98b8f3f729875cf
BLAKE2b-256 090b66f3a4bd9df36aef73ef257b82882ce192115f22fe35ab5610a92678c47d

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page