pythonhook源码_webhook python

hacker|
103

文章目录:

如何使用pyflakes给python做语法检查

python是一门动态语言。在给python传参数的时候并没有严格的类型限制。写

python程序的时候,发现错误经常只能在执行的时候发现。有一些错误由于隐藏的比较深,只有特定逻辑才会触发,往往导致需要花很多时间才能将语法错误

慢慢排查出来。其实有一些错误是很明显的,假如能在写程序的时候发现这些错误,就能提高工作效率。最近我发现,可以用pyflakes这个程序对

python语法进行语法检查,这样可以尽量早的发现错误。pyflakes有三种使用方法,第一种是当作命令行工具使用。第二种可以作为vim的插件,

在vim编辑器中使用,实现所见即所得。第三种是可以在emacs中使用。

pyflakes作为命令行工具

安装pyflakes这个程序很简单。

这是一个命令行工具。在linux下,可以直接运行 ‘pyflakes 文件名’ 对文件进行语法检查。

在vim编辑器中使用pyflakes

首先要确保vim支持python2.5以上版本,如果不确定是否支持,请在vim中运行命令。

!-- lang: shell --

:version

结果例如:

+代表支持的功能,-代表不支持的功能。由于上图所示的vim不支持python, 所以需要重新编译vim。

要编译支持python2.5以上版本的vim, 第一要具有python2.5以上版本。第二要有vim源码,./configure

--with-features=huge --enable-pythoninterp 然后再运行make ;make

install编译并且安装。

确定vim支持python2.5以上版本的方法为,在vim中运行“:python import sys; print sys.version"

在vim支持了Python之后,直接下载pyflakes.vim

将下载的压缩包,放在$HOME/.vim/下解压。在$HOME/.vim/ftplugin/python/下会增加一个pyflakes目录和pyflakes.vim文件。

然后在.vimrc文件中增加”filetype plugin indent on“。即可实现在vim编辑器中检查python语法的功能。

emacs支持

emacs可以通过flymake支持pyflakes。首先要安装命令行模式的pyflakes, 然后将下面的代码加入$HOME/.emacs

!-- lang: cpp --

(autoload 'flymake-find-file-hook "flymake" "" t)

(add-hook 'find-file-hook 'flymake-find-file-hook)

(setq flymake-gui-warnings-enabled nil)

(setq flymake-log-level 0)

(when (load "flymake" t)

(

defun flymake-pycheckers-init ()

(

let*

(

(

temp-file

(

flymake-init-create-temp-buffer-copy

'flymake-create-temp-inplace

)

)

(

local-file

(

file-relative-name

temp-file

(

file-name-directory buffer-file-name

)

)

)

)

(

list "pyflakes" (list local-file)

)

)

(add-to-list 'flymake-allowed-file-name-masks

'("\\.py\\'" flymake-pycheckers-init))

)

)

然后在emacs界面中可以显示python语法错误的地方。

Python 有什么奇技淫巧

看看下面这些算不算1.元类(metaclass)PyPy的源码里有个pair和extendabletype"""Twomagictricksforclasses:classX:__metaclass__=extendabletype#insomeotherfileclass__extend__(X):#andhereyoucanaddnewmethodsandclassattributestoXMostlyusefultogetherwiththesecondtrick,whichletsyoubuildmethodswhose'self'isapairofobjectsinsteadofjustone:class__extend__(pairtype(X,Y)):attribute=42defmethod((x,y),other,arguments):pair(x,y).attributepair(x,y).method(other,arguments)Thisfindsmethodsandclassattributesbasedontheactualclassofbothobjectsthatgointothepair(),withtheusualrulesofmethod/attributeoverridingin(pairsof)subclasses.Formoreinformation,seetest_pairtype."""classextendabletype(type):"""Atypewithasyntaxtrick:'class__extend__(t)'actuallyextendsthedefinitionof't'insteadofcreatinganewsubclass."""def__new__(cls,name,bases,dict):ifname=='__extend__':forclsinbases:forkey,valueindict.items():ifkey=='__module__':continue#XXXdoweneedtoprovidesomethingmoreforpickling?setattr(cls,key,value)returnNoneelse:returnsuper(extendabletype,cls).__new__(cls,name,bases,dict)defpair(a,b):"""Returnapairobject."""tp=pairtype(a.__class__,b.__class__)returntp((a,b))#tpisasubclassoftuplepairtypecache={}defpairtype(cls1,cls2):"""type(pair(a,b))ispairtype(a.__class__,b.__class__)."""try:pair=pairtypecache[cls1,cls2]exceptKeyError:name='pairtype(%s,%s)'%(cls1.__name__,cls2.__name__)bases1=[pairtype(base1,cls2)forbase1incls1.__bases__]bases2=[pairtype(cls1,base2)forbase2incls2.__bases__]bases=tuple(bases1+bases2)or(tuple,)#'tuple':ultimatebasepair=pairtypecache[cls1,cls2]=extendabletype(name,bases,{})returnpair先说extendabletype。嘛其实注释已经说得听明白了,就是一个C#里面的partialclass的Python实现。然后是pair和pairtype。pairtype就是根据两个类创建一个新的类,这个类继承自使用这两个类的基类构造的pairtype(有点绕……)或者tuple。有啥用呢?可以拿来实现multimethod。class__extend__(pairtype(int,int)):deffoo((x,y)):print'int-int:%s-%s'%(x,y)class__extend__(pairtype(bool,bool)):defbar((x,y)):print'bool-bool:%s-%s'%(x,y)pair(False,True).foo()#prints'int-int:False,True'pair(123,True).foo()#prints'int-int:123,True'pair(False,True).bar()#prints'bool-bool:False,True'pair(123,True).bar()#Oops,nosuchmethod好像这个例子里元类只是个打辅助的角色,好玩的都在那个pair里……再换一个。classGameObjectMeta(type):def__new__(mcls,clsname,bases,_dict):fork,vin_dict.items():ifisinstance(v,(list,set)):_dict[k]=tuple(v)#mutableobjnotallowedcls=type.__new__(mcls,clsname,bases,_dict)all_gameobjects.add(cls)forbinbases:game_objects_hierarchy.add((b,cls))returncls@staticmethoddef_dump_gameobject_hierarchy():withopen('/dev/shm/gomap.dot','w')asf:f.write('digraph{\nrankdir=LR;\n')f.write('\n'.join(['"%s"-"%s";'%(a.__name__,b.__name__)fora,bingame_objects_hierarchy]))f.write('}')def__setattr__(cls,field,v):type.__setattr__(cls,field,v)iffieldin('ui_meta',):returnlog.warning('SetAttr:%s.%s=%s'%(cls.__name__,field,repr(v)))这个是从我写的三国杀游戏中提取的一段代码(点我签名上的链接)。大意就是把class上所有可变的容器都换成不可变的,然后记录下继承关系。曾经被这个问题坑过,class上的值是全局共享的,逻辑代码一不小心修改了class上的值,单机测试的时候是测不出来的,然后放到线上……就悲剧了……当时绞尽脑汁没有想到是这个问题硬生生的回滚了……发现了问题之后就加上了这个东西,不允许修改class上的东西。记录下继承关系是为了画类图。还有就是常用的做数据注入metadata={}defgen_metafunc(_for):defmetafunc(clsname,bases,_dict):meta_for=getattr(_for,clsname)meta_for.ui_meta=UIMetaDescriptor()ifmeta_forinmetadata:raiseException('%sui_metaredefinition!'%meta_for)metadata[meta_for]=_dictreturnmetafuncfromgamepack.thbimportcharacters__metaclass__=gen_metafunc(characters.sakuya)classSakuya:#于是这个就不是类了,而是作为数据存到了metadata这个dict里char_name=u'十六夜咲夜'port_image='thb-portrait-sakuya'figure_image='thb-figure-sakuya'miss_sound_effect='thb-cv-sakuya_miss'description=(u'|DB完全潇洒的PAD长十六夜咲夜体力:4|r\n\n'u'|G月时计|r:|B锁定技|r,准备阶段开始时,你执行一个额外的出牌阶段。\n\n'u'|G飞刀|r:你可以将一张装备牌当【弹幕】使用或打出。按此法使用的【弹幕】无距离限制。\n\n'u'|DB(画师:小D@星の妄想乡,CV:VV)|r')Ruby党不要喷,我知道你们可以做的更优雅……2.Python沙盒逃逸刷新三观的Python代码3.PEP302NewImportHook最近在把刚才提到的纯Python游戏向Unity引擎上移植。玩过Unity的就会知道,Unity的游戏的资源都是打包在一起的,没有单独的文件,Python解释器就不高兴了……于是写了importhook,用Unity提供的API来读py文件。#-*-coding:utf-8-*-#--stdlib--importimpimportsys#--thirdparty--#--own--fromclrimportUnityEngine,WarpGateController#--code--classUnityResourceImporter(object):known_builtin=('sys','imp','cStringIO','gevent_core','gevent_ares','gevent_util','gevent_semaphore','msgpack_packer','msgpack_unpacker','UnityEngine',)def__init__(self,bases,unity_loader):self.bases=basesself.last_fullname=''self.last_text=''self.last_ispkg=Falseself.unity_load=unity_loaderdeffind_module(self,fullname,path=None):iffullnameinsys.modules:returnselfhead=fullname.split('.')[0]ifheadinself.known_builtin:returnNonerst=self.do_load_module(fullname)ifrst:self.last_text,self.last_ispkg=rstself.last_fullname=fullnamereturnselfelse:returnNonedefload_module(self,fullname):iffullnameinsys.modules:returnsys.modules[fullname]iffullname!=self.last_fullname:self.find_module(fullname)try:code=self.last_textispkg=self.last_ispkgmod=sys.modules.setdefault(fullname,imp.new_module(fullname))mod.__file__=""%fullnamemod.__loader__=selfifispkg:mod.__path__=[]mod.__package__=fullnameelse:mod.__package__=fullname.rpartition('.')[0]co=compile(code,mod.__file__,'exec')exec(co,mod.__dict__)returnmodexceptExceptionase:UnityEngine.Debug.LogError('Errorimporting%s%s'%(fullname,e))raiseImportError(e)defdo_load_module(self,fullname):fn=fullname.replace('.','/')asset=self.try_load(fn+'.py')ifassetisnotNone:returnasset,Falseasset=self.try_load(fn+'/__init__.py')ifassetisnotNone:returnasset,Truedeftry_load(self,filename):forbinself.bases:asset=self.unity_load(b+filename)ifassetisnotNone:returnassetreturnNonesys.meta_path.append(UnityResourceImporter(['Python/THBattle/','Python/Site/','Python/Stdlib/',],WarpGateController.GetTextAsset))需要的extensionmodule都静态编译到解释器里了,所以没考虑。4.可以批量执行操作的listclassBatchList(list):def__getattribute__(self,name):try:list_attr=list.__getattribute__(self,name)returnlist_attrexceptAttributeError:passreturnlist.__getattribute__(self,'__class__')(getattr(i,name)foriinself)def__call__(self,*a,**k):returnlist.__getattribute__(self,'__class__')(f(*a,**k)forfinself)classFoo(object):def__init__(self,v):self.value=vdeffoo(self):print'Foo!',self.valuefoo=Foo(1)foo.foo()#Foo!1foos=BatchList(Foo(i)foriinxrange(10))foos.value#BatchList([0,1,2,3,,9])foos.foo()#你能猜到的

你都用Python 来做什么?

当我知道可以做这些之后,我特别想会。因为论文查阅、答案确认查询;想知道豆瓣8分以上电影,或者穿越类的电影、处理工资数据考核表等。

可以干什么

1、上学吧答案神器 主要实现的是无限制获取上学吧网站上的题目答案(绕过 IP 限制),并实现了自动识别验证码,只用输入某个题目的网址,即可一键获取答案,速度非常快。「想要哈哈,自己或者给孩子辅导作业必备啊?」

2、抓取某系统内全部学生姓名学号及选课信息

3、扫描研究生系统上的弱密码用户、模拟登录图书馆系统并自动续借

4、给钓鱼网站批量提交垃圾信息 经常会收到含有钓鱼网站链接的短信的,一般都是盗取 QQ 密码的偏多,其实可以使用 Python 来批量给对方的服务器提交垃圾数据(需要先抓包),这样骗子看到信息之后就不知道哪些是真的哪些是假的了,说不定可以解救一部分填了密码的同学。

5、网易云音乐批量下载 可以批量下载网易云音乐热歌榜的歌曲,可以自己设定数量,速度非常快。

6、批量下载读者杂志某一期的全部文章

7、 获取城市PM2.5浓度和排名

8、爬取某网商品价格信息

你都用 Python 来做什么?

那Python 作为一种功能强大的编程语言,因其简单易学而受到很多开发者的青睐。那么,Python 的应用领域有哪些呢?

Python 的应用领域非常广泛,几乎所有大中型互联网企业都在使用 Python 完成各种各样的任务,例如国外的 Google、Youtube、Dropbox,国内的百度、新浪、搜狐、腾讯、阿里、网易、淘宝、知乎、豆瓣、汽车之家、美团等等。概括起来,Python 的应用领域主要有如下几个。

Web应用开发

Python 经常被用于 Web 开发,尽管目前 PHP、JS 依然是 Web 开发的主流语言,但 Python 上升势头更劲。尤其随着 Python 的 Web 开发框架逐渐成熟(比如 Django、flask、TurboGears、web2py 等等),程序员可以更轻松地开发和管理复杂的 Web 程序。例如,通过 mod_wsgi 模块,Apache 可以运行用 Python 编写的 Web 程序。Python 定义了 WSGI 标准应用接口来协调 HTTP 服务器与基于 Python 的 Web 程序之间的通信。举个最直观的例子,全球最大的搜索引擎 Google,在其网络搜索系统中就广泛使用 Python 语言。另外,我们经常访问的集电影、读书、音乐于一体的豆瓣网(如图 1 所示),也是使用 Python 实现的。

图1用Python实现的豆瓣网

不仅如此,全球最大的视频网站 Youtube 以及 Dropbox(一款网络文件同步工具)也都是用 Python 开发的。

自动化运维

很多操作系统中,Python 是标准的系统组件,大多数 Linux 发行版以及 NetBSD、OpenBSD 和 Mac OS X 都集成了 Python,可以在终端下直接运行 Python。有一些 Linux 发行版的安装器使用 Python 语言编写,例如 Ubuntu 的 Ubiquity 安装器、Red Hat Linux 和 Fedora 的 Anaconda 安装器等等。另外,Python 标准库中包含了多个可用来调用操作系统功能的库。例如,通过 pywin32 这个软件包,我们能访问 Windows 的 COM 服务以及其他 Windows API;使用 IronPython,我们能够直接调用 .Net Framework。通常情况下,Python 编写的系统管理脚本,无论是可读性,还是性能、代码重用度以及扩展性方面,都优于普通的 shell 脚本。

人工智能领域

人工智能是项目非常火的一个研究方向,如果要评选当前最热、工资最高的 IT 职位,那么人工智能领域的工程师最有话语权。而 Python 在人工智能领域内的机器学习、神经网络、深度学习等方面,都是主流的编程语言。可以这么说,基于大数据分析和深度学习发展而来的人工智能,其本质上已经无法离开 Python 的支持了,原因至少有以下几点:

目前世界上优秀的人工智能学习框架,比如 Google 的 TransorFlow(神经网络框架)、FaceBook 的 PyTorch(神经网络框架)以及开源社区的 Karas 神经网络库等,都是用 Python 实现的;微软的 CNTK(认知工具包)也完全支持 Python,并且该公司开发的 VS Code,也已经把 Python 作为第一级语言进行支持。Python 擅长进行科学计算和数据分析,支持各种数学运算,可以绘制出更高质量的 2D 和 3D 图像。总之,AI 时代的来临,使得 Python 从众多编程语言中脱颖而出,Python 作为 AI 时代头牌语言的位置,基本无人可撼动!最后,如果你的时间不是很紧张,并且又想快速的提高,最重要的是不怕吃苦,建议你可以价位@762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

网路爬虫

Python 语言很早就用来编写网络爬虫。Google 等搜索引擎公司大量地使用 Python 语言编写网络爬虫。从技术层面上将,Python 提供有很多服务于编写网络爬虫的工具,例如 urllib、Selenium 和 BeautifulSoup 等,还提供了一个网络爬虫框架 Scrapy。

科学计算

自 1997 年,NASA 就大量使用 Python 进行各种复杂的科学运算。并且,和其它解释型语言(如 shell、js、PHP)相比,Python 在数据分析、可视化方面有相当完善和优秀的库,例如 NumPy、SciPy、Matplotlib、pandas 等,这可以满足 Python 程序员编写科学计算程序。

游戏开发

很多游戏使用 C++ 编写图形显示等高性能模块,而使用 Python 或 Lua 编写游戏的逻辑。和 Python 相比,Lua 的功能更简单,体积更小;而 Python 则支持更多的特性和数据类型。比如说,国际上指明的游戏 Sid Meier's Civilization(文明,如图 2 所示)就是使用 Python 实现的。

图2Python开发的游戏

除此之外,Python 可以直接调用 Open GL 实现 3D 绘制,这是高性能游戏引擎的技术基础。事实上,有很多 Python 语言实现的游戏引擎,例如 Pygame、Pyglet 以及 Cocos 2d 等。以上也仅是介绍了 Python 应用领域的“冰山一角”,例如,还可以利用 Pygame 进行游戏编程;用 PIL 和其他的一些工具进行图像处理;用 PyRo 工具包进行机器人控制编程,等等。有兴趣的读者,可自行搜索资料进行详细了解。

请教关于用python编写屏幕取词的程序问题

1、屏幕取词技术实现原理与关键源码----

Ubuntu 下可以监视 gtk.Clipboard 来获取当前选中文字和位置。

我以前尝试过定时抓取鼠标附近图像做 OCR 来取词,

改成快捷键取词会省一点。

直接获得文字的悬停取词比较麻烦。

网页、XUL 应用程序可以有鼠标悬停事件。

X11 自己没有, 不过以前流行中文平台、中文外挂时候 TurboLinux 的中文 X-window 被修改为集成鼠标悬停取词翻译。

Gtk 程序也许你可以在 ATK 层入手,自己改 ATK 和用 LD_LIBRARY_PATH。

windows下很不好做。

普遍用的是HOOK API的方法。

可以参考stardict的取词模块。

不过我感觉stardict的取词模块也不是太好用(没金山词霸的好用),感觉有bug。

似乎以前某版本的金山词霸可以翻译图片中的文字,就是用 OCR

再,金山似乎出过 Linux Qt3 版本,找 Zoomq 几位在金山的老大索取源码看看吧

嗯, 金山词霸确实出过 Linux 版本,

是基于 wine 的,不是原生的 Linux 版本...

linux下就不知道,windows下,应该是做一个api hook,钩住TextOut,DrawText和DrawTextEx。

要取词的时候给鼠标所在的窗口发一个WM_PAINT消息,让窗口重绘。

当窗口调用TextOut, DrawText或是DrawTextEx进行重绘的时候,你就可以根据传入的参数知道

窗口想在鼠标下画什么东西了。

python 用什么模块处理网页的javascript

lxml 配合 html5lib

可以很好的解析 html DOM

但对于js的解析 据我所知现在没有什么很成熟的模块能做这个

解析js肯定不是正则能办得到的, 比较现实的方案是

从webkit下手, 但光这一个库就有10+M

(利用webkit自己解析js等解析完之后读取html dom, 什么时候解析完,什么内容需要解析,什么内容不应该解析是使用的难点)

如果你碰到的js代码比较简单

可以自己看看js代码然后使用python模拟js代码得到网址

其中使用webkit是最难的(不是简单显示界面,需要自己hook)

模拟js其次

lxml是最普遍的了

(这个解析一般的html必须配合其他html解析库,自带的那个html解析不是很健壮碰到稍微差点的页面就不能正确解析)

另外html DOM 里面 beautifulsoup 是一个比较老道的使用正则实现解析HTML DOM的库.

1条大神的评论

  • avatar
    访客 2022-07-08 上午 03:33:21

    akes首先要确保vim支持python2.5以上版本,如果不确定是否支持,请在vim中运行命令。!-- lang: shell --:version结果例如:+代表支持的功能,-代表不支持的功能。由于上图所示

发表评论