设为首页 收藏本站
查看: 966|回复: 0

[经验分享] bat 转换为python

[复制链接]

尚未签到

发表于 2015-4-28 09:10:29 | 显示全部楼层 |阅读模式
  
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需要注意的,好像没有太多了,基本上,这种转换,一次受累,长时间受益。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-61424-1-1.html 上篇帖子: 深入Python(2): __init__.py 用法 下篇帖子: Python例程:使用adodbapi访问MSSQL数据库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表