执行其它非python程序
受限执行
结束执行
操作系统接口
相关模块
1 一些函数
callable
callable()是一个布尔函数,确定一个对象是否可以通过函数操作符(())来调用。如果函数可调用便返回True,否则便是False。 比如:
>>> callable(1) False >>> callable(type) True
compile
compile(string,something,‘eval‘/‘single‘/‘exec‘)。程序员通过compile来动态的生成一个可执行的代码对象。第一个是string类型的代码,第二个不知道是什么通常为‘‘。第三个是 ‘eval‘ or ‘single‘ or ‘exec‘。 当string代表的是一个可以求值的表达式的时候,选‘eval‘,当string是一个单行的可执行的python语句选‘single‘,如果string是多行语句选exec。
>>> exeObj=compile(‘8+40‘,‘‘,‘eval‘) >>> eval(exeObj) 48 >>> exeObj=compile("print ‘hello world‘",‘‘,‘single‘) >>> exec exeObj hello world >>> exeObj=compile(‘‘‘ ... for i in range(0,3): ... print i ... ‘‘‘,‘‘,‘exec‘) >>> exec exeObj 0 1 2
但是,
>>> callable(exeObj)
False
因为 exeObj不可以用"()"来调用。
eval和exec
eval(), eval可以接受一个字符串(字符串的内容必须是一个表达式)或者compile返回的可执行代码段作为参数,然后对参数求值。
exec 与 eval一样。不过exec还可以执行文件,但文件内容必须是可执行的代码。比如:
我们有一个文件 runFor.py
bash-2.05$ cat runFor.py for i in range(0,5): print i
在python里面,我们用exec来执行这个文件
>>> f=open(‘runFor.py‘) >>> exec f 0 1 2 3 4
所以,exec可以执行文件。但是我们再运行一下 exec f
>>> exec f >>>
什么都没有,这是为什么呢? 这是因为此时f已经读到文件末尾了,我们用f的tell属性来看当前文件内指针在哪,
>>> f.tell()
31L
再对比一下文件的大小
>>> import os >>> os.path.getsize(‘runFor.py‘) 31L
可知当前文件指针在结尾处了,我们可以用f.seek(0)来把指针移动回开头
>>> f.seek(0) >>> exec f 0 1 2 3 4
input
input等同于eval和raw_input的组合。 我们用例子说明:
>>> a=raw_input(‘input something: ‘) input something: [1,2,3,4] >>> a ‘[1,2,3,4]‘
上面我们用raw_input来读取输入,虽然我们输入的是[1,2,3,4],但是实际上返回的是string
>>> a=input(‘input something: ‘) input something: [1,2,3,4] >>> a [1, 2, 3, 4]
而如果用input,我们输入的是[1,2,3,4] 返回的也是[1,2,3,4] 相当于用eval 把raw_input的值求值了一下。
2 执行非python程序
2.1 os.system
os.system(‘cmd‘) 会执行cmd。cmd可以是命令也可以是外部程序,os.system在执行后会把输出打印到标准输出,同时会返回一个值,如果成功返回0,如果不成功返回非零。
>>> import os >>> a=os.system(‘uname‘) SunOS >>> a 0
2.2 os.popen
与os.system一样,os.popen(‘cmd‘)会执行外部命令cmd。但是os.popen会把返回值放入一个文件对象。
>>> import os >>> a=os.popen(‘ls -l‘) >>> print a.readline() total 64 >>> print a.readline() -rw-r--r-- 1 oratop dba 0 May 22 17:17 a >>> print a.readline() -rw-r--r-- 1 oratop dba 59 May 16 13:54 importee.py >>> print a.readline() -rw-r--r-- 1 oratop dba 259 May 16 13:54 importee.pyc >>> print a.readline() -rw-r--r-- 1 oratop dba 282 May 16 11:42 m1.pyc