the5fire的技术博客

关注python、vim、linux、web开发和互联网--life is short, we need python.


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

作者:the5fire | 标签:       | 发布:2013-12-10 6:43 a.m. | 阅读量: 8670, 8552

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

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

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

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

#coding:utf-8
import sys
from types import ModuleType

class Tenv(ModuleType):
    def __init__(self, self_module):
        self.self_module = self_module

    def __getattr__(self, name):
        return '%s to ->test' % name

if __name__ == "__main__":
    pass
else:
    self = sys.modules[__name__]
    sys.modules[__name__] = Tenv(self)

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

>>>from modu import the5fire
>>>print the5fire
the5fire to ->test

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

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

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


----EOF-----

扫码关注,或者搜索微信公众号:码农悟凡


其他分类: