我使用的是subprocess.call,你只要給它一個argumets數組,它將構建命令行並執行它。有什麼辦法可以獲得使用subprocess.call時執行的完整命令行?
首先是否有任何轉義涉及? (例如,如果我通過作爲參數的路徑有空格的文件,/path/my file.txt
將這個被轉義?"/path/my file.txt"
)
,是有什麼辦法讓系統產生此命令行(後逃逸,並全部)前正在執行?
因爲我需要檢查生成的命令行是否不超過一定數量的字符(以確保它在執行時不會發生錯誤)。
我使用的是subprocess.call,你只要給它一個argumets數組,它將構建命令行並執行它。有什麼辦法可以獲得使用subprocess.call時執行的完整命令行?
首先是否有任何轉義涉及? (例如,如果我通過作爲參數的路徑有空格的文件,/path/my file.txt
將這個被轉義?"/path/my file.txt"
)
,是有什麼辦法讓系統產生此命令行(後逃逸,並全部)前正在執行?
因爲我需要檢查生成的命令行是否不超過一定數量的字符(以確保它在執行時不會發生錯誤)。
如果您沒有使用shell=True
,那麼實際上並不涉及「命令行」。 subprocess.Popen
只是將您的參數列表傳遞給底層的execve()
系統調用。
同樣,沒有逃脫,因爲沒有殼涉及,因此沒有什麼可以解釋的特殊字符,沒有什麼是要試圖標記你的字符串。
沒有字符限制擔心,因爲參數不會連接成一個命令行。參數的最大數量和/或單個參數的長度可能有限制。
如果你是使用shell=True
,你必須構建在命令行中自己將它傳遞給subprocess
之前。
[在Windows上,它是不同的故事](http://stackoverflow.com/a/27867015/4279) – jfs
'getconf ARG_MAX'在我的系統上返回2MiB(1/4'limit stacksize')。 [*「可用於新進程的組合參數和環境列表的字節數爲{ARG_MAX}。這個總數中是否包含空終止符,指針和/或任何對齊字節的實現定義。 http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html) – jfs
我正在使用shell = False,我在Linux上。這意味着如果我只是做一些像len(「」.join([「program」,「arg1」,「arg2」,「argn」]))<65535我應該理論上是安全的嗎? – daniels
它看起來像'subprocess.list2cmdline'這樣做,你有任何人可以測試的調用的例子嗎? – Marius