python转bat_bat 转换为python

Python vs BAT: 用Python来实现批处理

开始将原先的Windows批处理脚本适当的转为Python,好处是自然的,Python的脚本比Windows脚本好维护的多,不过转换不是那么简单直白,一一记录一些心得:

命令行参数

Windows批处理的参数,通常就是通过命令行或者环境变量传给bat,前者就是bat中常见的%1,%2,shift这些东西,在python中可以用OptionParser来实现,OptionParser是我用过最方便的命令行参数解析模块了,可以参考网友总结的中文说明,或者参考一下代码,基本也就清楚如何使用了:

try:

from optparse import OptionParser

except ImportError:

try:

from optik import OptionParser

except ImportError:

raise ImportError, 'Requires Python 2.3 or the Optik option parsing library.'

parser = OptionParser(usage=u"这个脚本用于测试")

parser.add_option('-p', '--project', dest='project',default=os.path.normpath(os.path.join(os.getcwd(), '../..')),

help=u'设置项目目录,缺省为:当前目录的上两级目录')

parser.add_option("-s", '--dosvn', action="store_true", dest="dosvn",

help=u'设置是否检测svn,缺省为不检测')

parser.add_option('-w', '--waittimeout', dest='waittimeout',type="int", default=300,

help=u'设置启动时的等待超时,缺省为300秒')

(options, args) = parser.parse_args(sys.argv[1:])

如果是环境变量,bat中用%environ%的形式,python中则可以用 os.environ.get(”prompt”),这个对应比较直白自然。

其实Windows还支持一些很奇怪的变量(官方叫做Modifier),像是%~dp0,这个是表示当前批处理文件所在目录,这是因为Windows的批处理是在功能有限,也不支持函数,对于一些很常用的操作没办法,只能用这些密码一样的符号来实现了。

启动进程

批处理中最方便的功能就是顺序启动一个个进程了,当然也包括cmd自己的内部命令(比如dir什么的)或者call其他的批处理文件,这些在python中统一归subprocess这个模块来做,官方的文档已近给出用subprocess替代原先的诸如os.system,os.spawn,os.popen之类调用的方法,因为subprocess足够的灵活和强大。比如在bat中想捕获一个子进程的输出到一个变量中,得使用这样的难懂的语法,我前面的帖子中曾经给出过一个这样的例子:

for /F %%A in ('svnlook author -r %REV% %1') do @set AUTHOR=%%A

在Python的subprocess下,就比较简单了:

process = subprocess.Popen(target, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

(stdoutput,erroutput) = process.communicate()

return stdoutput

获取进程返回

批处理中常常通过ERRORLEVEL来判断进程的返回值,来决定下一步的执行,这在python没有问题,用Popen建立的子进程有一个wait方法会等待子进程执行完毕,并返回子进程的return code。

不过对于调用一个bat的情况,则需要通过call来调用,才能得到它的和ERRORLEVEL一样效果的返回值,这点在文档中没有提及,却是非常重要的,下面的函数算是一个例子(绝大部分情况下,使用useCall和useShell都没错):

def run(self, target, useCall=True, useShell=True, cwd=None):

if useCall:

target = "call " + target

process = subprocess.Popen(target, shell=useShell, cwd=cwd)

process.wait()

return process.returncode

重定向

这是一个从bat转到python的难点,Windows基本上支持了和Unix类似的stdin、stdout、stderr以及管道等机制,这些在bat中可以和容易的调用,可以在写批处理时比较容易的灵活运用,而在python下要实现还是比较复杂的,不过其实理解以后也不会太难,主要是通过subprocess和python自己的文件处理功能相结合,下面是一个较复杂的例子,说明怎么通过tee.exe来实现子进程的的标准输出、标准错误输出同时定向到屏幕和文件:

self.tee = subprocess.Popen(["tee", LOG_FILE], stdin=subprocess.PIPE)

process = subprocess.Popen(target, shell=True, stdout=self.tee.stdin.fileno(), stderr=subprocess.STDOUT)

tee是来自unixutils的工具,广泛用来解决标准输入同时到标准输出和文件的一个小工具,不知道不用tee的话python怎么简单的解决这个问题,不过用tee的话上面的代码倒是很直接明了。

其他

还有什么批处理转到Python需要注意的,好像没有太多了,基本上,这种转换,一次受累,长时间受益。

你可能感兴趣的:(python转bat)