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

时间:2014-02-13 14:13:52

标签: python command-line-arguments sys

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

但是当缺少这个参数时,我希望显示错误消息:

用法:myscript.py [file ...]

脚本:

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

3 个答案:

答案 0 :(得分:3)

第{<1}}行首先运行。您的filename = sys.argv[1]测试未到达。

移动将len()filename设置为tree函数,并且不要在此处使用全局变量:

main()

答案 1 :(得分:1)

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

我更喜欢将测试移动到调用子句而不是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)

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

答案 2 :(得分:1)

而不是这样做,为什么不使用python中的argparse模块。如果未提供参数,它将自动打印使用声明,如下所示

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'来检查您传递的文件是否可写。

输出:

  

$&GT; python progargs.py

     

用法:progargs.py [-h]文件

     

progargs.py:错误:参数太少

     

$&GT; python progargs.py testanotherprog.py      

'testanotherprog.py',模式'r'位于0x7fe8ee422270&gt;