在sublime插件中调用第三方的程序(如系统命令行),是经过subprocess模式来进行的,关于subprogress中包含的方法及参数,请参看这里:
http://www.oschina.net/question/234345_52660
。
一、经常使用方法
通常插件开发中,咱们用到的是这个方法:
subprocess.Popen()
它将开辟一个新的子进程并返回一个Popen对象,该对象有一个重要的方法:
popen.communicate(input)
该方法可与第三方程序通讯,输入及接收输出,这样咱们就能够获得第三方程序运行时出现的信息了。
input就是一个输入,可为空。
这个方法返回一个元组,里面有两个值,一个是输出,一个出错的信息。输出的值已经对换行符做了处理,因此咱们获得的值只是一行字符串。咱们要正常格式显示的话就要处理一下,如下是处理的程序:
stdout=popen.communicate()
print(re.sub("\\n","\n",stdout))
二、在sublime text 2和sublime text 3中调用的区别
在开发过程当中我发现sublime text 3不能自动搜索系统路径(PATH)中的程序,而是要指定具体的程序位置才能正常运行,如compile_scripts.sh中使用到了luajit,它在/usr/local/bin/luajit这个位置,compile_scripts.sh中没有指定这个具体的位置,在sublime text 2中运行没有问题,但在sublime text 3中没有成功,那咱们应该怎么办呢,这就用到一个参数env了,这个参数能够设置环境变量,它是一个字典类型。
subprocess.Popen(...,env={"luajit":"/usr/local/bin/luajit"})
经过上面的设置就能正确运行luajit了。下面是一个完整的使用过程:
args=["quick_cocos2d-x/bin/compile_scripts.sh","-i","scripts","-o","res/game.zip"]
process=subprocess.Popen(args,cwd=path,env={"luajit":"/usr/local/bin/luajit"})
stdout=process.communicate()
print(re.sub("\\n","\n",stdout))