• 发布自己的Python包

    注册

    先在 Python 官网注册一个账号,地址是:https://pypi.python.org/pypi

    配置

    账号注册后,就可以用来登记新建的 Python 包,以及上传包更新。上传新包一般由 twine 命令完成, twine 需要知道 Python 仓库地址以及账号信息。因此,可以将这些信息写在配置文件 ~/.pypirc 里,这样运行命令时便不需要再次输入了。下面是一个配置示例,以 foo 为用户名, bar 为密码:

    1
    2
    3
    4
    5
    6
    7
    
    [distutils]
    index-servers=pypi
    
    [pypi]
    repository = https://upload.pypi.org/legacy/
    username = foo
    password = bar
    

    其中,密码也可以不写进配置,这样每次运行 twine 时,将提示输入密码。

    阅读全文
  • 用Flask框架写RESTful API

    本文先介绍一些 RESTful 理念 ,并通过一个 KVS 服务演示 RESTful API 的行为。最后以开发 KVS 服务为例,介绍如何使用 Flask 框架编写 RESTful API

    RESTful 理念

    RESTRepresentational State Transfer 的缩写, 中文翻译是 表现层状态转换 。这种软件构建风格,通过基于 HTTP 之上的一组 约束属性 ,提供万维网网络服务。其主要特点包括:

    • 统一接口Uniform Interface ),资源通过一致、可预见的 URI 及请求方法来操作;
    • 无状态Stateless ),请求状态由客户端维护,服务端不做保存;
    • 可缓存Cacheable ),可以通过缓存提升服务性能;
    • 分层系统Layered System );

    统一接口RESTful 服务最大的特点。统一接口的核心思想是,将服务抽象成各种 资源 ,并通过一套一致、可预见的 URI 以及 请求方法Request Method )来操作这些资源。这样一来,掌握了一种资源的使用方法,便可延伸到其他资源上,达到举一反三的效果。

    阅读全文
  • 用kazoo连接Zookeeper

    kazoo 是一个更优雅的 Zookeeper 库,用法更简单,也不容易出错。

    安装

    开始使用 kazoo 之前,你需要先装好它。推荐从 PYPI 安装:

    1
    
    $ pip install kazoo
    

    连接处理

    建立连接

    开始操作 Zookeeper 之前,需要先创建 KazooClient 对象并与 Zookeeper 建立连接:

    1
    2
    3
    4
    
    from kazoo.client import KazooClient
    
    zk = KazooClient(hosts='127.0.0.1:2181')
    zk.start()
    
    阅读全文
  • 完美解决Python2的编码问题

    背景

    计算机无论 存储信息 ,或者通过网络 交换信息基本单位 都是 八位字节 ( octet )。八位字节能够表示的字符数最多不超过 256 种:

    $2^8 = 256$

    这用来存储英文字母是绰绰有余,但是要满足全世界人民可就难了——汉字光常用的就几千个呢!怎么办呢?——用多个字节存储呗。这时,全世界人民齐头并进:

    • 中国人民使用 GB2312GBKGB18030
    • 日本人民使用 Shift JISEUC-JP
    • 韩国人民使用 EUC_KR
    • etc
    阅读全文
  • 用matplotlib绘制统计图表

    matplotlib 是一个用于 统计绘图Python 包,功能非常强大,堪比 Matlab !开始前,先通过几张图来感受一下:

    快速开始

    饼状图应该是最简单的统计图表了,用以介绍 matplotlib 画图方式最为合适。 数据准备就绪,生成饼状图只需若干行代码:

    阅读全文
  • matplotlib疑难杂症

    本文记录一些使用 matplotlib 过程中遇到的 问题 ,以及针对问题的 解决方案

    backend

    OSX 下,用 virtualenv 提供的虚拟 Python 环境运行 matplotlib ,会抛异常:

    ImportError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information.
    
    阅读全文
  • Python程序日志输出

    日志在问题分析时必不可少,好的程序应该输出足够的日志信息。

    那么,用 Python 语言开发程序时,如何输出日志呢?答案是—— logging 模块!

    1
    2
    3
    4
    
    >>> import logging
    >>> logging.warning('something wrong happended.')
    WARNING:root:Something wrong happended.
    >>> logging.info('seems good!')
    

    这是一个入门级例子,导入 logging 模块后,调用 warning 方法即可输出警告信息。

    阅读全文
  • 用difflib计算字符串相似度

    背景

    笔者最近有个任务需要从多个系统取出工单信息进行处理, 但是工单只有一个标题可以关联,而且还不是严格相等的。例如:

    • 易查通日常升级的发布请示
    • 【易查通】易查通系统日常升级

    这种判断比较棘手,只能利用 字符串相似度 进行衡量:

    1
    2
    
    if similarity('易查通日常升级的发布请示', '【易查通】易查通系统日常升级') > 0.5:
        print('哥俩是同个工单')
    

    那么, Python 有现成的类库可衡量字符串相似度么?

    阅读全文
  • Python程序日期时间处理

    常用时间

    上周

    如何判断上周是啥日期?以上周一为例:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    def get_this_monday():
        today = datetime.today()
        return (today - timedelta(days=today.weekday())).replace(
            hour=0,
            minute=0,
            second=0,
            microsecond=0,
        )
    
    def get_last_monday():
        return get_this_monday() - timedelta(days=7)
    

    函数 get_this_monday 获取本周一的日期,其中第 2 行取出当前时间;第 3-8 行计算得到本周一。

    函数 get_last_monday 获取上周一的日期,它先获取本周一的日期,再将其减去 7 天得到上周一。

    阅读全文
  • Python使用SMTP协议发送邮件

    smtplib

    Python 标准库中,smtplib 模块提供 SMTP 协议发送接口,使用起来十分方便。先来写一个用于发送邮件的函数,一睹为快:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    
    def send_email(host, port, user, password, fr, to, subject, body,
            smtp_cls=smtplib.SMTP_SSL):
    
        '''
            Send an email by smtp protocol
    
            Arguments
                host: email server host
                port: email server port
                user: user to login
                password: password
                fr: sender email address, the same as login user usually
                to: receiver email address
                subject: email title
                body: email content
    
            Returns
                None
        '''
    
        smtp = smtp_cls()
    
        # connect and login
        smtp.connect(host, port)
        smtp.login(user, password)
    
        # format message
        msg = u'''From: {fr}
    To: {to}
    Subject: {subject}
    Date: {date}
    
    {body}
    '''.format(
            fr=fr,
            to=to,
            subject=subject,
            date=datetime.datetime.now().strftime('%d/%m/%Y %H:%M'),
            body=body,
        )
    
        # do send
        smtp.sendmail(fr, to, msg.encode('utf8'))
        smtp.quit()
    
    阅读全文