python 运行外部程序或内部动态生成的程序段
函数
- 内建函数(BIFs)
BIF 属性 描述
bif.doc 文档字符串(或 None)
bif.name 字符串类型的文档名字
bif.self 设置为 None(保留给 built-in 方法)
bif.module 存放 bif 定义的模块名字(或 None) - 用户定义的函数属性(UDF)
UDF 属性 描述
udf.doc 文档字符串(也可以用 udf.func_doc)
udf.name 字符串类型的函数名字(也可以用 udf.func_name)
udf.func_code 字节编译的代码对象
udf.func_defaults 默认的参数元组
udf.func_globals 全局名字空间字典; 和从函数内部调用 globals(x)一样
udf.func_dict 函数属性的名字空间
udf.func_doc (见上面的 udf.doc)
udf.func_name (见上面的 udf.name)
udf.func_closure 包含了自由变量的引用的单元对象元组(自用变量在 UDF 中使用,但在别处定义;参见 python[语言]参考手册)
方法
- 内建方法(BIM)属性
BIM 属性 描述
bim.doc 文档字串
bim.name 字符串类型的函数名字
bim.self 绑定的对象 - 用户自定义的方法(UDM)
UDM 属性 描述
udm.doc 文档字符串(与 udm.im_fuc.__doc__相同)
udm.name 字符串类型的方法名字(与 umd.im_func.__name__相同)
udm.module 定义 udm 的模块的名字(或 none)
udm.im_class 方法相关联的类 (对于绑定的方法; 如果是非绑定, 那么为要求 udm 的类)
udm.im_func 方法的函数对象(见 UDFs)
udm.im_self 如果绑定的话为相关联的实例,如果非绑定位为 none
调用类的实例,需要实现__call__方法
代码对象
- callable():
确定一个函数是否是可调用对象,也就是是否可以通过函数操作"()"来调用,返回一个布尔值。 - compile():代码运行时,生成代码对象。
compile 的三个参数都是必需的,第一参数代表了要编译的 python 代码。第二个字符串,虽然
是必需的,但通常被置为空串。该参数代表了存放代码对象的文件的名字(字符串类型) 。compile 的
通常用法是动态生成字符串形式的 Python 代码, 然后生成一个代码对象——代码显然没有存放在
任何文件。
最后的参数是个字符串,它用来表明代码对象的类型。有三个可能值:
'eval' 可求值的表达式[和 eval()一起使用]
'single' 单一可执行语句[和 exec 一起使用]
'exec' 可执行语句组[和 exec 一起使用]
eval_code = compile("100+2", "", "eval") single_code = compile(r"print 'Hello world!'", "", 'single') exec_code = compile(""" req = input("Count how many numbers?") for eachNum in range(req): print eachNum """, "", "exec") eval(eval_code) exec single_code exec exec_code Hello world! Count how many numbers?3 0 1 2
- exec 可以直接使用字符串执行,但如果使用compil()速度会更快一点。 他还可以接受python文件对象
f = open("text.txt") exec f f.seek(0) exec f
之所以使用seek()的原因是,调用一次exec后文件指针会在文件最末尾,这样在调用一次exec就如同没有效用一样
4. input() 等价于 eval(raw_input())
在python运行时生成和执行python代码
dashes = "\n" + "- " * 50 exec_dict = {"f":""" for %s in %s: print %s""", "s": """ %s = 0 %s = %s while %s < len(%s): print %s[%s] %s = %s +1""", "n": """ %s = %d while %s < %d: print %s %s = %s + %d"""} def main(): ltype = raw_input("loop type?(For/While)") dtype = raw_input("Data type?(Number/Seq)") if dtype == "n": start = input("Starting value") stop = input("Ending value (Non-inclusive)?") step = input("stepping value?") seq = str(range(start, stop, step)) else: seq = raw_input("enter sequence?") var = raw_input("Iterative variable name?") if ltype == "f": exec_str = exec_dict["f"] % (var, seq, var) elif ltype == 'w': if dtype == "s": svar = raw_input("enter sequence name?") exec_str = exec_dict["s"]%(var, svar, seq, var, svar, svar, var, var, var) elif dtype == "n": exec_str = exec_dict["n"]%(var, start, var, stop, var, var, var, step) print dashes print exec_str, dashes exec exec_str print dashes if __name__ == '__main__': main()
有条件的执行代码
def bar(): return True def foo(): "foo() does not do much" return True bar.__doc__ = "bar() does not do much" foo.tester = """ if foo(): print 'PASSED' else: print 'FAILED'""" print dir() for eachAttr in dir(): obj = eval(eachAttr) if isinstance(obj, type(foo)): if hasattr(obj, "__doc__"): print "\nfunction '%s' has a doc string:\n\t%s" % (eachAttr, obj.__doc__) if hasattr(obj, "tester"): print "function '%s' has a tester...executing" % eachAttr exec obj.tester else: print "function '%s' has no tester...skipping" % eachAttr else: print "%s is not a function" % eachAttr
程序输出
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'bar', 'foo'] __builtins__ is not a function __doc__ is not a function __file__ is not a function __name__ is not a function __package__ is not a function function 'bar' has a doc string: bar() does not do much function 'bar' has no tester...skipping function 'foo' has a doc string: foo() does not do much function 'foo' has a tester...executing PASSED
执行其他python程序
execfile()函数
execfile(filename, globals=globals(), locals=locals())
执行其他非python程序
os.system()执行命令行
os.popen()
此章练习跳过
来源:https://www.cnblogs.com/jikeboy/p/6028590.html