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 关于使用列表与单个字符串的好处的说法是正确的。
我正在尝试对以下代码进行一些错误处理。
在行 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 关于使用列表与单个字符串的好处的说法是正确的。