python调用Ant构建时根据构建状态来决定命令行退出状态

在使用python执行Ant构建时遇到的问题:

使用os.system()调用Ant构建时,不论构建成功还是失败(BUILD SUCCESSFUL/BUILD FAILED),命令行的总是正常退出
要解决问题:
首先想到的是获取ant命令的返回值,根据返回值来决定命令行的退出状态(0或非0,0代表正常退出)
查阅相关资料,得知python调用系统命令的函数有:os.system、os.popen、commands.getstatusoutput/getstatus/getoutput、subprocess.Popen等。

  • os.system()无法获得返回值和输出
  • os.popen()返回的是file read的对象,对其进行读取read()操作可以看到执行的输出。
  • commands.getstatusoutput()返回系统命令的退出状态和输出
  • commands.getstatus()返回系统命令的退出状态
  • commands.getoutput()返回系统命令的输出

在使用commands的相关函数执行Ant命令行时:

没有执行构建直接退出(退出状态为:
1,输出为:
不是内部或外部命令,也不是可运行的程序或批处理文件)

结论:可能是因为Ant命令不是系统命令的缘故

于是查找资料又得知了subprocess的相关函数,如subprocess.call、subprocess.check_call、subprocess.check_output

  • subprocess.call (*popenargs , **kwargs )执行命令,并等待命令结束,再返回子进程的返回值
  • subprocess.check_call (*popenargs , **kwargs )执行上面的call命令,并检查返回值,如果子进程返回非0,则会抛出CalledProcessError异常,这个异常会有个returncode 属性,记录子进程的返回值。
  • subprocess.check_output()执行程序,并返回其标准输出

在使用subprocess.call命令执行Ant命令行时:

不论构建成功还是失败(BUILD SUCCESSFUL/BUILD FAILED),命令行总是正常退出(返回值为 0)

结论:命令行退出状态(即返回值)与Ant构建状态无关,只是表示Ant构建是否正常执行完毕的状态

既然命令行退出状态(即返回值)与Ant构建状态无关,

那么只有
解析命令行输出结果,根据构建成功或失败来决定命令行退出状态
于是,使用os.popen()命令获得输出结果并解析返回状态值

具体Python脚本DEMO如下:

#!Python.exe
# python version 2.7.8
# -*- coding: utf-8 -*-
"调用Ant执行构建,并返回构建结果"
__author__ = "donhui"
import os

BUILD_SUCCESSFUL = "BUILD SUCCESSFUL"
BUILD_FAILED = "BUILD FAILED"

# 调用Ant执行构建,并返回构建结果
#
def build(ant_target, build_file):
    ant_cmd = "ant -f {0} {1}".format(build_file, ant_target)
    logging.info(ant_cmd)
    status = 1
    for line in os.popen(ant_cmd):
        print line,
        if BUILD_SUCCESSFUL in line:
            status = 0
    if 1 == status:
        print BUILD_FAILED,
    return status

if __name__ == "__main__":
    # 调用Ant执行构建
    build_file = os.getcwd() + "/build.xml"
    ant_targets = "init"
    if 0 != build(ant_targets, build_file):
        exit(1)

参考:

  1. 【Python执行系统命令的方法 os.system(),os.popen(),commands】http://my.oschina.net/renwofei423/blog/17403
  2. 【python的subprocess模块用法】http://blog.csdn.net/g457499940/article/details/17068277
时间: 2024-11-08 00:34:08

python调用Ant构建时根据构建状态来决定命令行退出状态的相关文章

ESL python调用C模块时传递unicode字符串报错问题解决

在是用freeswitch时利用ESL的python调用时传递字符串报错 TypeError: in method 'ESLconnection_api', argument 2 of type 'char const *' 是由于python传递的字符串为unicode,在c语言char使用的ascii码方式在SWIG中做一下转换,代码如下 修改文件esl_wrap.cpp ##### /* for C or C++ function pointers *///添加定义#define SWIG

[Android] 基于 Linux 命令行构建 Android 应用(四):命令行构建

谷歌提供的 Android SDK 支持 Ant 自动构建[1],你可以使用调试和发行两种模式进行构建,两种模式不同之处在于调试模式 Ant 会调用内置的调试密钥,而发行模式调用你提供的私钥. 首先安装 Ant,并且将它添加到你的执行路径 PATH 里[2]. 调试模式构建 在调试模式下,Ant 会自动使用一个调试密钥对你的安卓应用进行签名,并且使用 zipalign 进行优化. 要进行调试模式下的构建,首先在命令行进入安卓项目根目录,然后使用 Ant 启动调试模式构建: $ ant debug

[Android] 基于 Linux 命令行构建 Android 应用(二):命令行管理项目

创建 Android 项目 在命令行创建 Android 项目需要用到 android 工具(该工具由 Android SDK 提供,位于 <sdk>/tools/ 目录下.).它能自动生成一个项目目录,其中包含若干默认应用程序文件,存案文件,配置文件和一个构建文件. 命令用法[1]: $ android create project \ --target <target_ID> \ --name <your_project_name> \ --path path/to

基于Java语言构建区块链(三)—— 持久化 &amp; 命令行

引言上一篇 文章我们实现了区块链的工作量证明机制(Pow),尽可能地实现了挖矿.但是距离真正的区块链应用还有很多重要的特性没有实现.今天我们来实现区块链数据的存储机制,将每次生成的区块链数据保存下来.有一点需要注意,区块链本质上是一款分布式的数据库,我们这里不实现"分布式",只聚焦于数据存储部分. 给大家推荐一个java内部学习群:725633148,进群找管理免费领取学习资料和视频.没有错就是免费领取!大佬小白都欢迎,大家一起学习共同进步! 数据库选择 到目前为止,我们的实现机制中还

用命令行对NDK项目进行构建(Win7环境下,以hello-jni项目为例)

尽管Eclipse可以很好地简化整个构建和部署过程,但Eclipse不是构建Android NDK项目的必要条件,整个过程也可以用命令行方式执行. 用原生组件构建Android项目需要两步:第一步构建原生组件,第二步构建Java应用程序并将Java应用程序与其原生组件打包. 第一步:构建原生组件. (1)打开命令提示符,将hello-jni project所在目录更改为当前目录. (2)在命令行下执行 ndk-build(ndk-build是一个调用Android构建系统的辅助脚本).这时And

Apache Ant学习笔记(2):Apache Ant命令行

Apache Ant的命令行是Apache Ant构建的基础.虽然我们通常在IDE中集成Apache Ant并使用它进行构建,但是了解Apache Ant的命令行对我们在IDE中使用Apache Ant还是很有好处的,如对IDE中Apache Ant的默认设置进行修改以符合自己的要求.此外,还是有用到命令行的场景,虽然很少. 进入命令行,输入ant -help,显示如下(括弧中的文字是选项的注释): ant [options] [target [target2 [target3] ...]] O

python 解析命令行

原文 http://python.jobbole.com/87014 python解析命令行 2016/12/13 · 基础知识 · 命令行 分享到:0 原文出处: 顾慎为 getopt:和C中的getopt()等价.optparse:2.7后已不推荐使用.argparse:基于optparse的新库.docopt:根据文档描述,自动生成.另一份参考文档:docopt. 更详细的内容可参考上述文档. getopt 若对C的getopt()函数不熟悉,或者倾向于使用较少的代码,或者需要对帮助信息和

exit-shell退出状态

1. intruduction exit 使shell(脚本)以指定状态值退出, 不带参数执行exit时,shell或脚本以最后执行命令的状态值退出. shell退出前, trap会捕猎EXIT信号.0表示执行成功,非0值表执行失败.它经常用于判断语句和循环语句来控制程序和表达式的流程. exit 使得编写脚本时可以自行设置退出时的状态值,使用$?引用,特定的退出状态值一般也会定义特定的退出含义.也可以用test来检查表达式的退出状态. bash 所有builtin 命令都会在成功时返回状态0,

转载---Python模块学习optparse 处理命令行参数

参考资料 http://docs.python.org/library/optparse.html 原文地址 http://mrwlwan.wordpress.com/2008/09/25/python%ef%bc%9a-%e4%bd%bf%e7%94%a8-optparse-%e5%a4%84%e7%90% Python 有两个内建的模块用于处理命令行参数: 一个是 getopt,<Deep in python>一书中也有提到,只能简单处理 命令行参数: 另一个是 optparse,它功能强