期待参数时的错误处理

时间:2017-01-26 17:21:06

标签: python if-statement

第一篇文章,也是第一次尝试编写超过99瓶的东西......

我正在处理从cli接受参数的代码,例如文本文件。预期用途是:

$:myfile.py input.txt

我已经顺利地完成了这个方面但是如果没有提供参数,cli会返回错误,我想提供一些错误响应,例如帮助列表或只是简单的&#34 ;不 - 给我一个文件"

现在这是前几行:

import sys
with open(sys.argv[1], 'r') as f:
    ifile = f.read()
    if len(sys.argv) == 1:
        empty = "Please give me something to do!"
        print empty

如果我提供了预期的参数,一切都很好,但如果没有提供参数,我得到这个:

Traceback (most recent call last):
  File "myfile.py", line 3, in <module>
    with open(sys.argv[1], 'r') as f:
IndexError: list index out of range

让我们说我只想要变量&#34;空&#34;如果条件未满足则打印...我该怎么做才能解决这个问题。

编辑:在使用argparse尝试下面的建议之后我得到了更好的结果但是我注意到argparse投掷了一个我没想到的角色。代码现在是:

   def main(filename):
    # do something with filename
    print('your filename is %s' % filename)


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='my program help')
    parser.add_argument('-f', help='specify file path')

当我运行这个时,我希望看到-h和-f作为选项,但我在说明中看到了额外的F.

my program help

optional arguments:
  -h, --help  show this help message and exit
  -f F        specify macro file path

你能告诉我如何摆脱这个额外的F.我已经尝试过一些东西但是它出现了,或者当我运行它时会出错。

3 个答案:

答案 0 :(得分:3)

使用argparse解析cli输入参数:

您案例的示例代码:

import argparse


def main(filename):
    # do something with filename
    print('your filename is %s' % filename)


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='my program help')
    parser.add_argument('filename', help='your desired filename')

    args = parser.parse_args()
    main(args.filename)

从没有参数的终端运行我们得到:

$ python ans_argparse.py
usage: ans_argparse.py [-h] filename
ans_argparse.py: error: the following arguments are required: filename

使用参数运行:

$ python ans_argparse.py 'myfile.txt'
your filename is 'myfile.txt'

创建自定义解析器可能需要时间,而不是那么直接。 argparse具有许多功能,并且嵌入在stdlib中,因此更喜欢使用它。

另一个例子

我通常创建parse_args()函数,因此测试它或在__main__之外调用它更容易:

import sys
import argparse


def main(filename):
    # do something with filename
    print('your filename is %s' % filename)


def parse_args(args_lst):
    parser = argparse.ArgumentParser(description='my program help')
    parser.add_argument('filename', help='your desired filename')
    return parser.parse_args(args_lst)


if __name__ == '__main__':
    args = parse_args(sys.argv[1:])                 
    main(args.filename)

你可以这样称呼它:

args = parse_args(['another_filename.txt'])

更新

使用metavar可选参数更改帮助中变量的显示名称。我鼓励您阅读argparse的文档以获取更多示例和用例

像这样:

parser.add_argument('-f', metavar='FILENAME', required=True, 
                    help='the file path for this program')

python myprog.py --help的输出:

optional arguments:
  -h, --help   show this help message and exit
  -f FILENAME  the file path for this program

注意:不要忘记required=True参数,这样您就会收到来自argparse的错误消息。

答案 1 :(得分:0)

你需要在使用它之前检查sys.argv的正确性,如果你之后显然已经很晚了。

像这样的例子

import sys
if len(sys.argv)>1:
    #do something
else:
    print "Please give me something to do!"

答案 2 :(得分:0)

argparse很棒,但你也可以保持简单

import sys

if len(sys.argv) != 2:
    sys.stderr.write("Usage: myfile.py textfile\n")
    exit(1)

with open(sys.argv[1], 'r') as f:
    pass # ...