在嵌套的tcsh命令行中捕获Python脚本输出,而不会抑制argparse输出

时间:2016-07-20 22:13:17

标签: python shell argparse csh tcsh

我有一个多层次的问题。这是我需要在csh / tcsh中使用的别名:

alias tools_alpha 'set tools_out=`/tools/bin/tools_alpha.py \!*` ; if ( $tools_out != '\'''\'' ) source $tools_out'

目标是如果程序运行它将返回一个shell脚本的名称,它将被获取。如果使用-h,则会将帮助写入stderr,但它会将空字符串返回到stdout,并且不会获取任何内容。

我已经使用perl进行了这项工作,但我想使用Python代替,因为我想添加一个GUI。我的第一个问题是,当使用argparse时,帮助会丢失。我有调试语句,我打印到stderr,并且工作正常。根据关于argparse帮助的文档应该写入stderr,所以我认为这样可行但是当用-h运行脚本时,没有写入帮助,而shell var不包含任何我可以识别的内容:

> echo $myout
echo: No match.

如果我打开日志文件,我会收到帮助文本。

set myout=`/tools/bin/tools_alpha.py -h | tee ~/.tools_setup.stderr`

我无法弄清楚帮助的去向以及$ myout捕获的内容,就好像它是stdout一样。我试图重写一个argparse的方法,确保我写的是stderr

class ArguementParser(argparse.ArgumentParser):
    def __call__(self, parser, namespace, values, option_string=None):
        parser.print_help(file=_sys.stderr)
        parser.exit()

但它并没有改变任何事情。任何见解都非常受欢迎,因为我已经用尽了所有自己的想法。

修改 如果我传递print_help(file = sys.stderr),那么我应该可以打印到stderr。

更重要的是,这个讨论听起来像是写stderr的帮助是默认的: https://www.python.org/dev/peps/pep-0389/#discussion-sys-stderr-and-sys-exit

def print_help(self, file=None):
    if file is None:
        file = _sys.stdout
    self._print_message(self.format_help(), file)

def _print_message(self, message, file=None):
    if message:
        if file is None:
            file = _sys.stderr
        file.write(message)

那么为什么这不起作用呢?

0 个答案:

没有答案