[英]Python subprocess.Popen error handling with shell=True/False issues
我正在嘗試對以下代碼進行一些錯誤處理。
在subprocess.Popen ...行中,如果shell = True,如果給出了正確的文件名,腳本將加密,但是不存在具有該名稱的文件,錯誤代碼不會被打印,但是會在終端上顯示因為沒有現有的文件/目錄。
如果我運行shell = False,則無法加密文件,但會顯示錯誤消息。
有人可以解釋我在做什么錯嗎? 我在這里查看了不同的帖子,但我仍然不明白為什么它不起作用。 我的猜測是,它與腳本的shell = True部分有關。
SrcDIR =“ / home / test / testsource /”
DstDIR =“ / home / test / testdest /”
try:
subprocess.Popen(["openssl aes-128-cbc -salt -in " + SrcDIR + str(var1) + " -out " + DstDIR + "enc." + str() + " -k " + str(var2)], shell=True)
output3 = ("file " + str(var1) + "created")
print(output3)
except IOError as reason2:
errormsg = ("Error encrypting file due to: \n" + str(reason2))
print(errormsg)
如果將shell
arg設置為False
,則args
參數將成為一個字符串序列 ,而不是單個字符串:第一個args
元素是要運行的程序的名稱,而后續元素是該程序的參數, 例如 (我正確理解您的代碼):
subprocess.Popen \
(
[
"openssl", "aes-128-cbc", "-salt",
"-in", os.path.join(SrcDIR, var1),
"-out", os.path.join(DstDIR, "enc." + var1),
"-k", var2
]
)
這也比嘗試通過shell
= True
傳遞單個命令字符串更好,因為這樣一來,您不必提防對shell具有特殊含義的字符。
即使使用shell = True,如果第一個參數是字符串列表,也會將其解釋為調用的參數列表。 還有其他原因可能不希望使用shell = True,但是不需要使用shell = True來使用參數列表並不是其中之一。
除此之外,Lawrence D'Oliveiro在使用列表而不是單個字符串的好處方面是正確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.