Python 应为参数时的错误处理

Python 应为参数时的错误处理,python,if-statement,Python,If Statement,第一篇文章,也是第一次尝试编码99瓶以上的东西 我正在编写接受cli参数的代码,例如文本文件。预期用途为: $:myfile.py input.txt 我的工作进展顺利,但是如果没有提供参数,cli将返回错误,我希望提供一些错误响应,例如帮助列表或简单的“否-给我一个文件” 现在,这里是前几行: import sys with open(sys.argv[1], 'r') as f: ifile = f.read() if len(sys.argv) == 1:

第一篇文章,也是第一次尝试编码99瓶以上的东西

我正在编写接受cli参数的代码,例如文本文件。预期用途为:

$:myfile.py input.txt

我的工作进展顺利,但是如果没有提供参数,cli将返回错误,我希望提供一些错误响应,例如帮助列表或简单的“否-给我一个文件”

现在,这里是前几行:

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
当我运行它时,我希望看到-h和-f作为选项,但我在描述中看到了一个额外的f

my program help

optional arguments:
  -h, --help  show this help message and exit
  -f F        specify macro file path
您能告诉我如何摆脱这个额外的F吗?我尝试了一些方法,但它要么出现,要么在运行时出错。

用于解析cli输入参数:

$ python ans_argparse.py 'myfile.txt'
your filename is 'myfile.txt'
您案例的示例代码:

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()
函数,以便在
\uuuuu main\uuuu
之外测试或调用它更容易:

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'])
parser.add_argument('-f', metavar='FILENAME', required=True, 
                    help='the file path for this program')
更新 使用
metavar
可选参数更改帮助中变量的显示名称。我鼓励您阅读的文档以了解更多示例和用例

像这样:

args = parse_args(['another_filename.txt'])
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
中得到一条错误消息。你需要在处理sys.argv之前检查它的正确性,如果在那之后做的话显然会迟到

比如像这样

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

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 # ...

当然它失败了,在你尝试打开某个东西之前,你需要检查sys.argv的长度,而不是事后。谢谢,我用结果编辑了我的文章。它工作得很好,但我有一个流氓角色,我不知道如何摆脱它。我用
metavar
示例编辑了我的文章,用于您的用例,如果可以使用新的更改,请更新