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

时间:2017-10-18 01:28:14

标签: python python-3.x subprocess popen ioerror

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

在行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)

2 个答案:

答案 0 :(得分:0)

如果将shell arg设置为False,则args参数将成为字符串的序列,而不是单个字符串:第一个{{ 1}} element是要运行的程序的名称,后续元素是该程序的参数,例如(如果我正确理解您的代码):

args

这也比尝试使用subprocess.Popen \ ( [ "openssl", "aes-128-cbc", "-salt", "-in", os.path.join(SrcDIR, var1), "-out", os.path.join(DstDIR, "enc." + var1), "-k", var2 ] ) = shell传递单个命令字符串更好,因为这样您就不必提防shell具有特殊含义的字符。

答案 1 :(得分:0)

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

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