簡體   English   中英

Python subprocess.Popen錯誤處理,帶有shell = True / False問題

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

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