通常我使用一个参数从命令行运行此脚本: 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
答案 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;