Python中调用pig语句:
通过三个shell核命令可以
os.system(‘执行的文件,可以是’)
os.popen()
os.startfile()
具体步骤:
1. 输入python,进入解释器模式。
2. Import os
3. 执行os.system(‘test.sh’)
其中test.sh的内容为 pig –xlocal e.pig,其直接执行pig命令。
同样,可以直接执行os.system(’ pig –xlocal e.pig’)
那么要是想获得e.pig执行后的返回值呢?
就要用os.popen()函数:
os.popen(camd[,mode[,bufsize]])
os.popen() 可以返回回显的内容,以文件描述符返回。
例如:
f = os.popen ("test.sh",r)
print f.read()
或者:
for line inos.popen("dir"):
print line
by the way,简单讲一下os.system和os.popen的区别:
使用os.popen调用test.sh的情况:python调用Shell脚本,有两种方法:os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码(默认返回值为0时,代表着运行成功。不成功,返回值根据执行的命令而不同),后者的返回值是脚本执行过程中的输出内容。实际使用时视需求情况而选择os.popen(cmd)这种调用方式是通过管道的方式来实现,返回一个file-like的对象,所以使用一个对象存储其返回内容,x=os.popen(cmd)。里面的内容是脚本输出的内容(可简单理解为echo输出的内容)。
假定有一个shell脚本test.sh:
#!/bin/bash
1. echo "hello world!"
2. exit 3
os.system(cmd)在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码,即脚本中“exit 1”的代码执行后,os.system函数返回值的高位数则是1,如果低位数是0的情况下,则函数的返回值是0×100,换算为10进制得到256。
如果我们需要获得os.system的正确返回值,那使用位移运算可以还原返回值:
1. >>> n = os.system(test.sh)
2. >>> n >> 8
3. >>> 3
这就是在python脚本中调用shell核命令的功能,而pig这种脚本语言就是核命令的集合。
我写的一个python脚本的例子,在云上调用pig脚本,返回值为一个字符串,你可以用t=type(file.read())去测试一下,然后print t看一下。
import time
#where is your pig
PIG_PATH = '/opt/pig/current/bin/pig'
PIG_SCRIPT= '/home/zhoujie/count/countlog2.pig'
blank=' '
file1='/mso/1/2013-04-08'
file2='/mso/1/2013-04-08'
if __name__ == "__main__":
pig_cmd = PIG_PATH + blank + '-f' + blank + PIG_SCRIPT + blank + '-param input=' + file1
print "pid_cmd1: " + pig_cmd
#print os.system(pig_cmd)
file = os.popen(pig_cmd)
result1= file.read()
pig_cmd = PIG_PATH + blank + '-f' + blank + PIG_SCRIPT + blank + '-param input='+file2
print "pid_cmd2: " + pig_cmd
file = os.popen(pig_cmd)
result2= file.read()
#change the string into integer
print result1 + " and "+result2
result1=result1[1:-2]
result2=result2[1:-2]