繁体   English   中英

限制传入的参数数量

[英]Limit number of arguments passed in

我正在使用argparse获取输入文件列表:

import argparse
p = argparse.ArgumentParser()
p.add_argument("infile", nargs='+', type=argparse.FileType('r'),  help="copy from")
p.add_argument("outfile", help="copy to")
args = p.parse_args()

但是,这为用户传递prog /path/to/* outfile打开了大门,在该目录中,源目录可能包含数百万个文件,shell扩展可能会超出解析器的范围。 我的问题是:

  1. 有没有办法禁用其中的外壳扩展(*)?

  2. 如果不是,是否有办法在将输入文件组装成列表之前对输入文件的数量设置上限?

(1)不,shell扩展由shell完成。 运行Python时,命令行已经扩展。 使用"*"'*'可以将其禁用,但是在shell上也会发生。

(2)是的,请在代码中尽早获取sys.argv的长度,如果太长则退出。

而且大多数外壳对扩展都有内置的限制。

如果你担心太多infile值,不使用FileType

p.add_argument("infile", nargs='+', help="copy from")

只接受文件名列表。 那不会花你太多钱。 然后,您可以根据需要打开和处理尽可能多的文件。

解析名称后, FileType打开文件。 可以在小脚本中立即使用一些文件,这没关系。 但是通常您不希望或不需要一次打开所有这些文件。 在现代Python中,建议您在with context打开文件,因此请立即将其关闭(而不是在脚本完成之前一直闲逛)。

FileType处理'-'stdin值。 如果无法打开文件,它将发布一个不错的错误报告。 但是,这就是您想要的吗? 或者,您宁愿处理每个文件,跳过错误名称。

总体FileType是一种便利,但是在严肃的应用程序中通常是一个糟糕的选择。

还有其他需要担心的问题outfile是(可能很长)文件列表的最后一个,“ +”输入文件列表是另外1个文件。 argparse接受这一点,但是可能会带来问题。 例如,如果用户忘记提供“输出文件”怎么办? 然后,最后一个输入文件将用作输出文件。 该错误可能会导致意外写入文件。 使用'-o','--outfile',可能更安全,从而使用户明确标记出文件。 用户可以先给它,这样他就不会忘记。

通常,最后使用“ +”和“ *”位置最安全。

暂无
暂无

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

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