[英]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)不,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.