经常写脚本的同学应该会经常碰到一些函数得反复的重写,比如日志,告警等。我在云上写了不少机器人脚本,每个都会涉及到一些公共的操作,比如,连接数据库(mysql,elasticsearch),寻找动态代理,发送短信,邮件通知等;要在这些脚本之间共享这些操作,需要将这些公共函数放到一个模块当中,并且发布到本地的python仓库当中。
这篇文章,简要记录一下生成自己模块的方式,同时也给大家一些tips,通过共享哪些函数可以减少我们的重复开发工作。
自定义模块的好处
- 首先,模块化开发最大的好处自然是减少重复的代码,一块代码,可以在不同的项目中复用
- 其次,通过模块的发布,可以快速将bug修复,新功能的添加等同步到各个项目当中
- 最后,模块可以“屏蔽”细节,不让函数细节,变量,环境参数等直接暴露在代码当中
哪些函数需要放到自定义模块当中
那作为一个python玩家,一般我们需要将哪些函数放到自定义模块里面呢?自然是我们常用的一些工具类函数(不以做项目为前提,只是玩),比如:
- 发送短信和邮件通知 (每当机器人运行某个任务失败时(比如薅羊毛失败),需要及时通知)
- 获取动态代理资源
- requests (已经使用了代理)
- 获取cookie (当机器人需要访问需要登陆的资源时,可以直接使用cookie,具体查看文章用chrome插件实现cookie同步)
- 生成数字签名 (使用nodejs/python实现bitmex API的签名signature)
- 获取shodan上的可以用资源
还有其他的,比如生成时间窗口,获取交易所实例等,就不一一列举
生成自定模块
当你整理完自己的需求之后,就生成自定模块了。步骤很简单:
- 创建一个目录,比如: common_util
- 加入你的模块文件,比如
common_util.py
- 在目录下创建一个
setup.py
文件,包含类似内容: (注意如果你的模块引用了其他模块,需要添加requires
参数。tips: 使用pycharm编辑,可以自动为你添加)
from distutils.core import setup
setup(
name='common_util',
version='1.0',
author='lex',
url='https://lex-lee.blog.csdn.net/',
author_email='103192647@qq.com',
py_modules=['common_util'],
requires=['requests', 'pymysql', 'boto3'])
目前,你的目录结构为:
MacBook-Pro:common_util lex$ tree
.
├── common_util.py
└── setup.py
- 然后执行
python3 setup.py build
,会多出一个build
目录
├── build
│ └── lib
│ └── common_util.py
- 再执行
python setup.py sdist
,会多出一个dist
目录和MANIFEST文件,dist
目录下的.gz
文件是我们可以用于发布包
├── MANIFEST
├── dist
│ └── common_util-1.0.tar.gz
解压后,其目录结构为:
├── dist
│ ├── common_util-1.0
│ │ ├── PKG-INFO
│ │ ├── build
│ │ │ └── lib
│ │ │ └── common_util.py
│ │ ├── common_util.py
│ │ └── setup.py
- 进入该目录,执行
python3 setup.py install
即可安装到本地的python库当中
安装完成后,进入python,检查是否包已经可用
这里一个小tips:自己写的函数也会忘的,建议大家把注释写好
通过ansible,将模块发布到云服务器上
既然都已经写了公共模块了,自然是因为这个公共模块常常要用,自然也会有需要需要发布到不同的机器上。但因为自己封装的函数总会涉及到一些access key, password等,自然不能发布到PyPI上,所以,需要借助ansible往自己的云资源上发布。
我们可以写一个自动化的脚本,调用ansible进行发布:
#!/usr/bin/env bash
_*_ coding: utf-8 _*_
@Time : 2019/6/25 9:42 AM
@Author : lij021
@File : build_install_deploy.sh
echo "开始 build ---------------------------"
python3 setup.py build
echo "开始 sdist ---------------------------"
python setup.py sdist
echo "开始 install 到云 ---------------------------"
cp ./dist/* ./roles/deploy/files/
ansible-playbook -i hosts deploy.yml
echo "开始 install 到本地 ---------------------------"
cd dist
tar -zxvf common_util-1.0.tar.gz
cd common_util-1.0
python3 setup.py install
因此,整个项目的目录结构如下:
.
├── MANIFEST
├── __pycache__
│ └── common_util.cpython-36.pyc
├── build
│ └── lib
│ └── common_util.py
├── build_install_deploy.sh
├── common_util.py
├── deploy.yml
├── dist
│ ├── common_util-1.0
│ │ ├── PKG-INFO
│ │ ├── build
│ │ │ └── lib
│ │ │ └── common_util.py
│ │ ├── common_util.py
│ │ └── setup.py
│ └── common_util-1.0.tar.gz
├── hosts
├── roles
│ └── deploy
│ ├── files
│ │ └── common_util-1.0.tar.gz
│ └── tasks
│ └── main.yml
└── setup.py
ansible的脚本也很简单:
---
- name: upload file
copy: src={{package_file}}.tar.gz dest=~ force=yes mode=0644
- name: install package
become: yes
shell: tar -zxvf {{package_file}}.tar.gz; cd {{package_file}}; python3 setup.py install;
至此,你每有一个版本更新,运行一下build_install_deploy.sh
即可发布到所有的环境,:)
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦