我正在尝试为以下代码进行一些错误处理。
在行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)
答案 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在使用列表与单个字符串的好处方面是正确的。