簡體   English   中英

對於sys.argv中的fi [1:]:參數列表太長了

[英]for fi in sys.argv[1:]: argument list too long

我試圖在文件夾中的所有文本文件上執行python腳本:

for fi in sys.argv[1:]:

我收到以下錯誤

-bash: /usr/bin/python: Argument list too long

我稱之為Python函數的方式如下:

python functionName.py *.txt

該文件夾有大約9000個文件。 有沒有辦法運行此功能,而不必將我的數據拆分到更多的文件夾等? 拆分文件不太實用,因為我將來必須在更多文件中執行該功能...謝謝

編輯:根據選定的正確回復和回復者(Charles Duffy)的評論,對我有用的是:

printf '%s\0' *.txt | xargs -0 python ./functionName.py

因為我沒有有效的shebang ..

這是一個操作系統級別的問題(命令行長度限制),並且通常使用操作系統級別(或至少在Python之外的過程)解決方案來解決:

find . -maxdepth 1 -type f -name '*.txt' -exec ./your-python-program '{}' +

...要么...

printf '%s\0' *.txt | xargs -0 ./your-python-program

請注意,這會在找到的每批文件中運行your-python-program ,其中批量大小取決於可以適合ARG_MAX的名稱數量; 如果這不合適,請參閱MarcusMüller的優秀答案。

不。這是命令行長度(以字節為單位)的內核限制。

通常,您可以通過執行來確定該限制

getconf ARG_MAX

哪個,至少對我來說,產生2097152(字節),這意味着大約2MB。

我建議你自己使用python來處理文件夾,即讓你的python程序能夠處理目錄而不是單個文件,或者從文件中讀取文件名。

前者可以使用os.walk(...)輕松完成,而第二種選擇(在我看來)更靈活。 使用argparse模塊為你的python程序提供一個易於使用的命令行語法,然后添加一個文件類型的參數(參見參考文檔),python將自動能夠理解像-這樣的特殊文件名,這意味着你可以改為的

for fi in sys.argv[1:]

for fi in opts.file_to_read_filenames_from.read().split(chr(0))

甚至可以讓你做類似的事情

find -iname '*.txt' -type f -print0|my_python_program.py -file-to-read-filenames-from - 

不要這樣做。 將掩碼傳遞給python腳本(例如將其稱為python functionName.py "*.txt" )並使用glob( https://docs.python.org/2/library/glob.html )展開它。

我想使用glob模塊。 使用此模塊,您可以調用以下程序:

python functionName.py "*.txt"

那么shell不會將*.txt擴展為文件名。 Python程序將在argumens列表中接收*.txt ,您可以將其傳遞給glob.glob()

for fi in glob.glob(sys.argv[1]):
    ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM