为了账号安全,请及时绑定邮箱和手机立即绑定

以python自定义模块的方式共享API(数据,短信通知、邮件通知,代理等)

经常写脚本的同学应该会经常碰到一些函数得反复的重写,比如日志,告警等。我在云上写了不少机器人脚本,每个都会涉及到一些公共的操作,比如,连接数据库(mysql,elasticsearch),寻找动态代理,发送短信,邮件通知等;要在这些脚本之间共享这些操作,需要将这些公共函数放到一个模块当中,并且发布到本地的python仓库当中。

这篇文章,简要记录一下生成自己模块的方式,同时也给大家一些tips,通过共享哪些函数可以减少我们的重复开发工作。

自定义模块的好处

  • 首先,模块化开发最大的好处自然是减少重复的代码,一块代码,可以在不同的项目中复用
  • 其次,通过模块的发布,可以快速将bug修复,新功能的添加等同步到各个项目当中
  • 最后,模块可以“屏蔽”细节,不让函数细节,变量,环境参数等直接暴露在代码当中

哪些函数需要放到自定义模块当中

那作为一个python玩家,一般我们需要将哪些函数放到自定义模块里面呢?自然是我们常用的一些工具类函数(不以做项目为前提,只是玩),比如:

  • 发送短信和邮件通知 (每当机器人运行某个任务失败时(比如薅羊毛失败),需要及时通知)
  • 获取动态代理资源
  • requests (已经使用了代理)
  • 获取cookie (当机器人需要访问需要登陆的资源时,可以直接使用cookie,具体查看文章用chrome插件实现cookie同步
  • 生成数字签名 (使用nodejs/python实现bitmex API的签名signature
  • 获取shodan上的可以用资源

还有其他的,比如生成时间窗口,获取交易所实例等,就不一一列举

生成自定模块

当你整理完自己的需求之后,就生成自定模块了。步骤很简单:

  1. 创建一个目录,比如: common_util
  2. 加入你的模块文件,比如common_util.py
  3. 在目录下创建一个 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
  1. 然后执行python3 setup.py build,会多出一个build目录
├── build
│   └── lib
│       └── common_util.py

  1. 再执行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

  1. 进入该目录,执行 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 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消