“sys.argv [x]”超出范围

时间:2014-04-18 20:37:06

标签: python command-line user-input

我必须运行确切的命令:

python3 main.py flip pattern.ppm > flippedpattern.ppm

以下代码:

def main(args):
    if sys.argv[1] == "flip":
        fileName = sys.argv[2]
        method = read_ppm(fileName)
        print(method.flip())
        return
if __name__ == '__main__':
    sys.exit(main(sys.argv))

我有一个ppm文件,我正在尝试使用另一个模块来操作它,但它一直告诉我sys.argv [4]在将它分配给变量'outputFile'时超出范围

执行的代码本质上应该是翻转命令

method = "flip"
method = read_ppm("pattern.ppm")
f.write(method.flip())

使用visual studio中的repl做到这一点会导致成功,但是当我尝试从命令行通过主模块运行它时,它不起作用。为什么是这样?是'>'字符以某种方式干扰了sys.argv,还是我做出了一个我无法看到的清晰计数错误?

else语句将使用输入

解释输入无法捕获和简单打印
python3 main.py flip pattern.ppm

没有任何文件重定向。

2 个答案:

答案 0 :(得分:3)

>之后的论点不是传递给python的命令行的一部分。它是shell写入标准输出的文件。因此,例如,print "Hello"会将Hello写入flippedpattern.ppm。

如果你想将flippedpattern.ppm作为第四个命令行参数,只需省略>在通话中。 (然后,标准输出将被写入屏幕。)

编辑:根据您修改过的描述,您可以编写sys.stdout.write(method.flip())。这与print(method.flip())之间的唯一区别是print在字符串的末尾添加换行符,而.write不会。

答案 1 :(得分:0)

我不确定Visual Studio是如何工作的,但是如果它适用于argv[4],它可能会将脚本名称之后的每个单词解释为另一个参数(因为它不是bash)对">")进行特殊解释。

因此,要使用bash工作,您应该将代码中的argv[4]更改为argv[3],并将输出文件作为另一个参数传递而不是重定向:

python main.py flip pattern.ppm flippedpattern.ppm

,或保持代码原样并添加一个"虚拟"第三个参数所以输出文件将是第4个,例如强制它处理">"作为一个常规论点:

python3 main.py flip pattern.ppm ">" flippedpattern.ppm