前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >[Python库]分析一个python库--sh(系统调用)

[Python库]分析一个python库--sh(系统调用)

作者头像
the5fire
发布2019-02-28 17:34:28
发布2019-02-28 17:34:28
1.4K0
举报
文章被收录于专栏:Python程序员杂谈

周末看到一个python的库:sh。功能是让你像调用方法那样调用系统中的命令。比方说你想调用系统的ls方法,普通的做法是: import subprocess;subprocess.call("ls") 虽然可用,但总是觉得不是一家人。用sh库的做法是: from sh import ls;ls() 就可以了,毫无违和感。

看到这个库的时候特别好奇是怎么实现的,于是看下源码。发现调用部分写的很巧妙。怎么实现的呢?

直观思维就是在sh的库里一定实现了一个ls的方法,然后绑定到了系统的ls命令上,然后对输出进行重定向。但如果真这么做的话,系统有多少个命令不就要实现多少个函数吗?于是看了下,果然不是这么做的,里面没有任何对应名称的函数。那怎么实现from sh import ls的呢?

带着疑问看了下代码,发现是通过ModuleType来实现的,模拟一下就是:

代码语言:javascript
复制
#coding:utf-8importsysfromtypesimportModuleTypeclassTenv(ModuleType):def__init__(self,self_module):self.self_module=self_moduledef__getattr__(self,name):return'%s to ->test'%nameif__name__=="__main__":passelse:self=sys.modules[__name__]sys.modules[__name__]=Tenv(self)

粘贴这段代码保存为modu.py,然后在同目录下进入python交互模式:

代码语言:javascript
复制
>>>frommoduimportthe5fire>>>printthe5firethe5fireto->test

自己尝试下,是不是有点意思。从这我们知道怎么从一个module中import出不存在的函数或者类了,那么它是怎么把import的函数绑定到系统中呢?

这个问题你可以看下源码,然后思考一下。

sh代码地址:https://github.com/amoffat/sh

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013-12-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档