0

我运行脚本:python script.py arg1 arg2,但我想做这个技巧,如果提供了 arg3,那么做一些事情。当前代码看起来像这样,但不起作用。

if len(sys.argv) == 3:
    pannot = open(sys.argv[3],"w")
    for v in anno2.values():
        pannot.write("\t".join(v))
        pannot.write("\n")
    pannot.close()
else: print("if you want to get an annotation, please, provide third argument")

错误如下:IndexError: list index out of range。你能建议是什么问题吗?(脚本在windows下测试过)。

4

3 回答 3

3

我相信这是因为script.py作为第一个参数传递,所以你应该检查:

if len(sys.argv) == 4:

因为有四个参数:

['script.py', arg1, arg2, arg3]

这是一些工作代码:

emil ~/test > python script.py arg1 arg2 arg3
arg3
emil ~/test > cat script.py 
import sys
if len(sys.argv) == 4:
    print sys.argv[3] # do something
else:
    print("Please, provide third argument")
emil ~/test > python script.py arg1 arg2
Please, provide third argument
于 2013-08-20T08:52:23.377 回答
2

要访问最后一个元素,请使用sys.argv[-1]. 或者sys.argv[2]在你的情况下。列表具有从零开始的索引。因此,对于长度为 3 的列表,最后一个元素将位于testList[2].

如果要检查是否提供了第三个参数,则需要测试长度为 4。

C:\Python27>python scriptName.py 123 456 789
['scriptName.py', '123', '456', '789']

第一个参数是脚本名称,因此如果您需要查看传递了多少附加参数,您需要检查是否len(sys.argv) == 4然后使用sys.argv[-1].

通过测试长度来检查的测试程序sys.argv将是。

import sys

if len(sys.argv) == 4:
    print "4 arguments were provided. The arguments were :", sys.argv[1:]
elif len(sys.argv) == 3:
    print "3 Arguments were provided. The arguments were :", sys.argv[1:]

输出 :

C:\Python27>python scriptName.py 123 456 789
4 arguments were provided. The arguments were : ['123', '456', '789']

C:\Python27>python scriptName.py 123 456
3 Arguments were provided. The arguments were : ['123', '456']
于 2013-08-20T08:52:13.710 回答
0

很简单,sys.argv包含脚本的名称和参数,所以len(sys.argv)参数的数量 + 1。所以一个简单的脚本:

import sys
print len(argv)

给出:

$ python script.py
1
$ python script.py arg1 arg2 arg3
4
于 2013-08-20T09:08:23.257 回答