繁体   English   中英

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

[英]“sys.argv[x]” is out of range

我必须运行确切的命令:

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文件,正在尝试使用另一个模块进行操作,但是在将其分配给变量'outputFile'时,它始终告诉我sys.argv [4]超出范围。

对于flip命令,执行的代码本质上应该是这个

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

确实在Visual Studio中使用repl会成功,但是当我尝试通过命令行通过主模块运行它时,它将无法工作。 为什么是这样? “>”字符会以某种方式干扰sys.argv还是我在做出看不见的计数错误?

else语句将说明输入没有捕获,而只是使用输入进行打印

python3 main.py flip pattern.ppm

没有任何文件重定向。

>之后的参数不是传递给python的命令行的一部分。 这是外壳程序将标准输出写入的文件。 因此,例如, print "Hello"将Hello写入flippedpattern.ppm。

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

编辑:给定修改后的描述,您可以编写sys.stdout.write(method.flip()) 这和print(method.flip())之间的唯一区别是,print在字符串的末尾添加了换行符,而.write则没有。

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

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

python main.py flip pattern.ppm flippedpattern.ppm

,或保留代码不变,并添加“ dummy”第三个参数,以使输出文件为第4个,例如,也强制其将“>”视为常规参数:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM