Python subprocess.Popen 错误处理 shell=True/False 问题

Python subprocess.Popen error handling with shell=True/False issues

我正在尝试对以下代码进行一些错误处理。

在行 subprocess.Popen...... 如果 shell=True 如果给出了正确的文件名,脚本将加密,但是没有具有该名称的文件错误代码未打印,但它确实在终端上显示为不存在 file/directory.

如果我 运行 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 参数设置为 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 传递单个命令字符串要好,因为这样您就不必提防对 [=25 具有特殊含义的字符=].

即使 shell=True,如果第一个参数是字符串列表,它会将其解释为调用的参数列表。人们可能不想使用 shell=True 的其他原因,但不需要使用 shell=True 来使用参数列表不是其中之一。

除此之外,Lawrence D'Oliveiro 关于使用列表与单个字符串的好处的说法是正确的。