[英]What is Python first argument? sys.argv[0] or sys.argv[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.