Antkillerfarm Hacking V7.0

Python(四)

2019-07-07

Python

多线程 & 同步 & 异步

python异步并发模块concurrent.futures,主要用来实现多线程和多进程的异步并发。

代码示例:

from concurrent import futures

def test(num):
    import time
    return time.ctime(),num

with futures.ThreadPoolExecutor(max_workers=1) as executor:
    future = executor.submit(test,1)
    print future.result()

>>>
('Tue Jan 17 15:23:10 2017', 1)

如果是多进程的话,可使用ProcessPoolExecutor。由于python是解释语言的关系,多线程设计基本就是残废状态,因此,通常情况下,不要使用多线程,请使用多进程

参考:

http://lovesoo.org/analysis-of-asynchronous-concurrent-python-module-concurrent-futures.html

python异步并发模块concurrent.futures简析

https://mp.weixin.qq.com/s/QIfxxY6z7y77RDE_8gDEIg

并行运算Process Pools

http://www.cnblogs.com/Python666/p/7506546.html

Python单例模式

https://mp.weixin.qq.com/s/tJsdM-4q_RC-5AhTw3y49w

schedule使用进阶

https://mp.weixin.qq.com/s/fwa3cbDI0fIjjztA60XuUQ

同步与异步Python有何不同?

https://mp.weixin.qq.com/s/0tLI_UNhpD-UPa9o206xFA

为什么Python多线程无法利用多核

https://mp.weixin.qq.com/s/6zVU6i75hZ3ZXZAmW0G5Mw

非常适合小白的Asyncio教程

https://mp.weixin.qq.com/s/nHIQ5uwxZM-9DbSu_jL6DQ

异步Python比同步Python快在哪里?

https://mp.weixin.qq.com/s/0MMUTp_-JF97inzeJd4j1g

详解如何用Multiprocessing进行并行计算

mypy

mypy是一个针对python语言的静态类型检查工具。

官网:

http://www.mypy-lang.org/

参考:

https://mp.weixin.qq.com/s/dBK8x_WajI2A3L5v6OQEgA

四年完成400万行Python代码检查,甚至顺手写了个编译器

glob

glob的历史可以追溯到早期的UNIX系统。用它可以查找符合特定规则的文件路径名。

参考:

https://blog.csdn.net/csapr1987/article/details/7469769

python glob模块

https://mp.weixin.qq.com/s/suUXM4Tdj6ekKQWC0g04Yg

glob-被忽略的python超强文件批量处理模块

PLY

Python Lex-Yacc是一个python版本的lex/yacc实现。

官网:

http://www.dabeaz.com/ply/

参考:

https://blog.csdn.net/feixiaoxing/article/details/79123776

python编程(ply库)

https://blog.csdn.net/chosen0ne/article/details/8077880

Python语法解析器PLY——lex and yacc in Python

JPype

JPype是一个能够让python代码方便地调用Java代码的工具。官网:

https://sourceforge.net/projects/jpype/

参考:

http://blog.csdn.net/niuyisheng/article/details/9002926

JPype:实现在python中调用JAVA

http://www.cnblogs.com/yu-zhang/p/3817024.html

python调用java程序–jpype

SWIG

Simplified Wrapper and Interface Generator可以为C/C++的库生成其他高级脚本语言的Wrapper。

官网:

http://swig.org/

PLY和SWIG的作者都是David Beazley。

David M. Beazley,犹他大学博士。IEEE Gordon Bell Prize(1993,1998)。先后在Los Alamos和University of Chicago工作执教。超算领域专家。python语言核心开发者。

SLY

Sly Lex Yacc是David Beazley的新作,号称新一代的PLY。

官网:

https://sly.readthedocs.io/en/latest/

Cython

和SWIG功能类似的替代品。

官网:

https://cython.org/

示例:

https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/python/cython

编译:

python setup.py build_ext --inplace

运行:

>import hello
>hello.say_hello()

参考:

https://mp.weixin.qq.com/s/ODA74xgoS8X1HFxp4BfshQ

如何将Python自然语言处理速度提升100倍:用spaCy/Cython加速NLP

https://mp.weixin.qq.com/s/1Iyhsp5-2DyTfOb0JzqLZg

比Python快100倍,利用spaCy和Cython实现高速NLP项目

https://mp.weixin.qq.com/s/l-zmvQvmosw81G1wFCIDbQ

用Cython造个轮子

.pyc & .pyx & .pyd

.pyc: 编译好的二进制文件。

.pyx: python的c扩展文件,代码要符合cython的规范

.pyd: 编译好的cython动态库,仅在Windows平台有,Linux平台生成.so文件。

参考:

https://blog.csdn.net/sislcb/article/details/4002414

py文件编译为pyc

https://www.cnblogs.com/kaituorensheng/p/4452881.html

Cython学习

https://mp.weixin.qq.com/s/_fi4fpfN8Whe7_ZpkPL0tA

怎么给Python写C扩展?

https://mp.weixin.qq.com/s/eqNaX0YorcaMN8D9lnQprw

简单上手一波Cython

http://gashero.yeax.com/?p=38

使用C/C++扩展Python

Pythran

Pythran是一个transpiler,可以把Python的prototype转到C++。

官网:

https://pythran.readthedocs.io/en/latest/

参考:

https://mp.weixin.qq.com/s/hJGaREpBP0j7rqCXSZQMvA

把Python自动翻译成C++

pybind11

pybind11可以在C++11和Python之间建立互操作的关系,而且还是个header-only的方案。

pybind11的灵感来源于Boost.Python,但是后者属于Boost的一部分,使用起来太笨重。

官网:

https://pybind11.readthedocs.io/en/stable/

安装:

pip3 install pybind11

示例:

https://github.com/pybind/cmake_example

手动添加wrapper太麻烦。目前有一些开源项目,专门用来针对已有的C++代码来自动生成pybind11绑定代码:

  • binder
  • AutoWIG
  • robotpy-build

参考:

https://github.com/tensorflow/community/blob/master/rfcs/20190208-pybind11.md

pybind11 vs SWIG

https://zhuanlan.zhihu.com/p/52619334

使用pybind11将C++代码编译为python模块

https://zhuanlan.zhihu.com/p/192974017

pybind11的最佳实践

https://zhuanlan.zhihu.com/p/666269440

PyBind11简明教程

python调用GTK函数的一般规则

众所周知,GTK库是用C语言编写的,其相关的文档提供的也是C函数的接口,python接口的文档相对较少,获得也不太容易。因此有必要掌握一下这方面基本的命名规则。(这里只讲方法,对深层次的调用原理不做探究。)

1)类初始化函数

C:GtkWidget * gtk_button_new (void);

python:button = Gtk.Button()

这里除了把C函数式的写法,替换成python的类的写法之外,并无其他差异。

2)普通类成员函数

C:void gtk_container_add (GtkContainer *container, GtkWidget *widget);

python:button.add(image)

可以看出,C函数的第一个表示self类指针的参数被省略掉了。

3)回调函数

这里以按钮的click事件回调为例:

C:void user_function (GtkButton *button, gpointer user_data)

python:

button.connect("clicked", self.playToggled)

def playToggled(self, w):

这里的情况要复杂的多。首先在事件回调注册的时候,由于我们并没有给user_data赋值,因此照理说playToggled函数,只有button这一个参数。但实际传递给playToggled函数的有两个参数,self是一个用于占位的参数,w对应button,没有东西对应user_data。

4)用于输出的参数

C:void gst_message_parse_error (GstMessage *message, GError **gerror, gchar **debug);

python:err, debug = message.parse_error()

这个例子中的gerror和debug都是用于输出的参数。如果只想得到其一,还可用以下方法:

debug = message.parse_error()[2]

5)枚举类型

C:

enum GstSeekFlags
{
  GST_SEEK_FLAG_FLUSH,
  ...
}

python:Gst.SeekFlags.FLUSH

6)宏常量

C:#define GST_CLOCK_TIME_NONE ((GstClockTime) -1)

python:Gst.CLOCK_TIME_NONE

7)类型转换

大多数情况下,类型转换自动完成,并无什么问题。这里只讨论特殊的情况。

C:

gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
                         GST_SEEK_TYPE_SET, time_nanoseconds,
                         GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE))

python:

self.player.seek(1.0, Gst.Format.TIME, Gst.SeekFlags.FLUSH, Gst.SeekType.SET,\
                 time_nanoseconds, Gst.SeekType.NONE, Gst.CLOCK_TIME_NONE)

这里首先按照一般的方法,将C代码转化成python代码。但是运行之后,产生如下错误:

OverflowError: long too big to convert

究其原因,gst_element_seek的最后一个参数是uint64类型的。但python原生并不支持该类型,而是将之转换成int类型(实际上是int64类型),这样的话,GST_CLOCK_TIME_NONE的值显然超出了int64所能表示的范围。

解决的办法是使用ctypes库,将

Gst.CLOCK_TIME_NONE

改为

c_long(Gst.CLOCK_TIME_NONE).value

Django

Django是一个Web框架。

官网:

https://www.djangoproject.com/

中文教程:

https://www.runoob.com/django/django-tutorial.html

安装:

sudo pip install Django

参考:

https://mp.weixin.qq.com/s/-CaMHjsY580et8Hh_D2FSg

简约而不简单的Django新手图文教程

http://www.liujiangblog.com/course/django/

Django教程

SimpleHTTPServer

Django比较重量级了,如果只是想发布静态网页的话,可以用:

python -m SimpleHTTPServer 7800

或者

python3 -m http.server 7800

除此之外,Flask、tornado也是较常用的Web框架。

Flask底层使用的werkzeug库,是一个有名的WSGI工具包。

基于python新增的async/await语法的异步Web框架,是最近的新流派,代表有:Sanic

https://juejin.cn/post/6944598601674784775

异步Web框架Sanic凭什么比Django Flask强?

处理eml文件

代码示例:

https://github.com/antkillerfarm/antkillerfarm_crazy/blob/master/python/misc/hello_eml.py

这个示例主要使用email包来解析eml文件。

同时为了处理其中的html的内容,还用到了Beautiful Soup包。其网址为:

https://www.crummy.com/software/BeautifulSoup/

参见:

https://mp.weixin.qq.com/s/p86yvl3uAm3FXw4V9NlNoA

一文带你上手Python网页抓取神器BeautifulSoup库

https://mp.weixin.qq.com/s/3o_T7Tyrstur6jkj0gexMA

BeautifulSoup的使用

PDF

https://mp.weixin.qq.com/s/fBz__E2Xu4GC7w1Uqx5NAA

手把手教你如何用Python从PDF文件中导出数据

https://mp.weixin.qq.com/s/xCKC3cz7jUvrwl4uvMNKTA

20行Python代码教你批量将PDF转为Word

https://mp.weixin.qq.com/s/IznKbG3cEF6uxP0Fe_0oaQ

印度小哥“神剑”:PDF提取表格so easy!

https://mp.weixin.qq.com/s/J-H638ZzhB-GOXMeAQ9aww

Camelot: 三行代码提取PDF表格数据

https://mp.weixin.qq.com/s/c0hszsSDS-u4z-83Y7km8Q

pdf文档解析之pdfminer

https://mp.weixin.qq.com/s/1BoBHbXXOGPZ4HK437lH4Q

6款Python特殊文本格式处理库推荐

https://mp.weixin.qq.com/s/bz7rCy0YyF1HrrHrWt9Mpw

聊聊Python操作PDF的几种方法

https://mp.weixin.qq.com/s/jzjumS2oJfFO-4SBa0qooQ

利用Python将PDF文档转为MP3音频

https://mp.weixin.qq.com/s/FmdbdAWenXWuY9s7ykVORQ

三种方法,Python轻松提取PDF中全部图片

https://mp.weixin.qq.com/s/UVKOU11dfWwP9Uyw9E400Q

如何使用python提取pdf表格及文本,并保存到excel

Fork me on GitHub