Python中的sys.argv:索引超出范围的消息,而不是我的错误消息

2024-04-23 23:08:50 发布

您现在位置:Python中文网/ 问答频道 /正文

通常,我在命令行中使用一个参数运行此脚本: python myscript.py参数

但如果缺少这个参数,我希望显示错误消息:

用法:myscript.py[文件…]

脚本:

import sys
from lxml import etree

filename = sys.argv[1]

tree = etree.parse(filename)

def f1():
...
def main():
   if len(sys.argv) < 2:
           print 'usage: extract.py [file ...]'
           sys.exit(1)

   else:
      f1()

在我开始工作之前,我可以在没有争论的情况下得到错误消息,但是现在它停止工作了,我不明白为什么。。。 只有在不使用命令行的参数运行脚本时,才会收到此消息:

Traceback (most recent call last):
  File "myscript.py", line 14, in <module>
    filename = sys.argv[1]
IndexError: list index out of range

Tags: 命令行pyimport脚本消息用法参数def
3条回答

filename = sys.argv[1]首先运行。未达到您的len()测试。

将设置filenametree移到main()函数中,并且不要在此处使用全局变量:

def f1(tree):
    ...

def main():
    if len(sys.argv) < 2:
        print 'usage: extract.py [file ...]'
        sys.exit(1)

    filename = sys.argv[1]
    tree = etree.parse(filename)

    f1(tree)

if __name__ == '__main__':
    main()

与其这么做,不如使用python中的argparse模块。如果没有提供参数,它将自动打印如下的usage语句

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('file', type=argparse.FileType('r'))
args = parser.parse_args()      
print(args.file)

type=argparse.FileType('r')参数不是必需的,但最好使用它。

'r'表示并检查文件是否可读或存在。

类似地,您可以使用'w'检查传递的文件是否可写。

输出:

$> python progargs.py

usage: progargs.py [-h] file

progargs.py: error: too few arguments

$> python progargs.py testanotherprog.py

'testanotherprog.py', mode 'r' at 0x7fe8ee422270>

正如Martijn所说,sys.argv[1]在测试之前被引用。

我更喜欢将测试移到calling子句中,而不是main,如下所示:

import sys
from lxml import etree

def f1(tree):
    pass

def main(filename):
    tree = etree.parse(filename)
    f1(tree)

if __name__=="__main__":
    if len(sys.argv) == 2:
        main(sys.argv[1])
    else:
        print 'usage: extract.py [file ...]'
        sys.exit(1)

我觉得这在代码中提供了更合理的职责划分。

相关问题 更多 >