Python子流程.Popenshell错误处理=真/假问题

2024-05-12 20:37:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

排队子流程.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)

Tags: 文件test脚本truehomeshellfileprint
2条回答

如果将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传递单个命令字符串要好,因为这样就不必担心对shell有特殊意义的字符。在

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

除此之外,lawrenced'Oliveiro在使用列表与单个字符串的好处方面是正确的。在

相关问题 更多 >