导航

反射

Posted on 2016-04-22 10:21  徐言美  阅读(137)  评论(0编辑  收藏  举报

反射

#!/usr/bin/env python
#coding:utf8

import os
import sys
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#os.path.abspath(__file__)找到当前文件的绝对路径,os.path.dirname显示上级目录
sys.path.append(BASE_DIR)#把项目的目录作为一个元素加入到python搜索的列表中

if __name__=='__main__':
    args=sys.argv[1:]#获取传入的参数除了当前脚本名
    if len(args) <2:
        sys.exit("\033[31;1m参数长度不足必须大于2个\033[0m")
    try:
        cmd_args=args[1]#获取第一个参数 比如:cmd.run
        modeule_name,func_name=args[1].split('.')#把传入的命令以点分割  cmd.run分割为列表中的2个元素['cmd','run']
        modobj=__import__("modules.{0}".format(modeule_name))#使用__import__以字符串的形式导入包
        #<module 'modules' from '/Users/xym/PycharmProjects/s12/day9/modules/__init__.pyc'>
        #<module 'modules.cmd' from '/Users/xym/PycharmProjects/s12/day9/modules/cmd.py'>
        modobj=getattr(modobj,modeule_name)#反射 modobj=getattr(包,模块),(modules,cmd)
        func=getattr(modobj,func_name)#使用反射把传入的传输以字符串的方式动态调用模块中的函数或者类 getattr(modules/cmd,run)
        func(args)# func==>cmd.run('ls')

    except Exception,e:
        print e