我必须运行确切的命令:
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
没有任何文件重定向。
答案 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