标签归档:argparse

python argparse模块bug:将版本信息输出到标准错误

今天打算把 kuaipan cli 编译成 二进制版本

kuaipan cli 使用的官方模块argparse解析命令行参数

下面这种方式,已经被官方废弃了,应该是为了解决 -v冲突的问题

parser=argparse.ArgumentParser(version='0.2')

后来修改为

    parser.add_argument('-v','--version', action='version', version='0.2', help="show program's version number and exit")

于是写了个脚本自动编译,并且获取版本号

version=`kuaipan.py -v`
echo $version

但是 $version 始终为空 ,单独执行 kuaipan.py -v是没问题的

运行环境 debian下是Python 2.7.3 ,window下是Python 2.7.6 都不行

然后怀疑是 argparse的问题

查看了下argparse模块的源码 版本号 是 1.1

class _VersionAction(Action):
....
    def __call__(self, parser, namespace, values, option_string=None):
        version = self.version
        if version is None:
            version = parser.version
        formatter = parser._get_formatter()
        formatter.add_text(version)
        parser.exit(message=formatter.format_help())
....
def _print_message(self, message, file=None):
    if message:
        if file is None:
            file = _sys.stderr
        file.write(message)

# ===============
# Exiting methods
# ===============
def exit(self, status=0, message=None):
    if message:
        self._print_message(message, _sys.stderr)
    _sys.exit(status)

问题出来知道了,这里默认的version action 把信息输出到了 stderr标准错误

所以在命令行中获取不到

已经有人提交了issue18920 以及path 不知道什么时候能发布出来

目前临时解决方法是:将标准错误stderr输出到stdout

version=`kuaipan.py -v 2>&1`
echo $version#0.2