Python subprocess.Popen错误处理shell=True/False问题
我正在尝试为以下代码获取一些错误处理 在子流程的行中。Popen。。。。。。如果shell=True,脚本将在给定正确文件名的情况下进行加密,但是没有具有该名称的文件,错误代码不会打印出来,但在终端上显示为没有现有文件/目录 如果运行shell=False,则无法加密文件,但会打印错误消息 有人能解释我做错了什么吗?正如我在这里看过不同的帖子,但我仍然不明白为什么它不起作用。我的猜测是它与脚本的shell=True部分有关 SrcDIR=“/home/test/testsource/” DstDIR=“/home/test/testdest/”Python subprocess.Popen错误处理shell=True/False问题,python,python-3.x,subprocess,popen,ioerror,Python,Python 3.x,Subprocess,Popen,Ioerror,我正在尝试为以下代码获取一些错误处理 在子流程的行中。Popen。。。。。。如果shell=True,脚本将在给定正确文件名的情况下进行加密,但是没有具有该名称的文件,错误代码不会打印出来,但在终端上显示为没有现有文件/目录 如果运行shell=False,则无法加密文件,但会打印错误消息 有人能解释我做错了什么吗?正如我在这里看过不同的帖子,但我仍然不明白为什么它不起作用。我的猜测是它与脚本的shell=True部分有关 SrcDIR=“/home/test/testsource/” DstD
如果将
shell
arg设置为False
,则args
参数将成为字符串序列,而不是单个字符串:第一个args
元素是要运行的程序的名称,后续元素是该程序的参数,例如(如果我正确理解了您的代码):
这也比尝试用
shell
=True
传递单个命令字符串要好,因为这样您就不必注意对shell有特殊意义的字符。如果将shell
arg设置为False
,则args
参数将成为一个字符串序列,没有一个字符串:第一个args
元素是要运行的程序的名称,后续元素是该程序的参数,例如(如果我正确理解了您的代码):
这也比尝试使用
shell
=True
传递单个命令字符串要好,因为这样您就不必注意对shell有特殊意义的字符。即使使用shell=True,如果第一个参数是字符串列表,它也会将其解释为调用的参数列表。可能还有其他原因不想使用shell=True,但不需要使用shell=True来使用参数列表并不是其中之一
除此之外,Lawrence D'Oliveiro在使用列表与单个字符串的优点方面是正确的。即使shell=True,如果第一个参数是字符串列表,它也会将其解释为调用的参数列表。可能还有其他原因不想使用shell=True,但不需要使用shell=True来使用参数列表并不是其中之一
除此之外,劳伦斯·奥利维罗(Lawrence D'Oliveiro)在使用列表和单个字符串的好处方面是正确的。感谢您的帮助,现在我可以使用shell=False运行加密部分。然而,我仍然有错误检查的问题。即使文件不存在,子流程仍将执行并打印创建的文件。你有什么想法吗?试试
子流程。check_output
便利例程,它创建Popen对象,收集其输出并检查错误,一次完成。或者如果你不想从命令中获得输出,请使用子流程。改为check_call
。嘿,如果你有时间,另一个快速问题。是否可以使用subprocess.check_输出为if语句返回错误代码?例如,如果subprocess.check_output==错误代码0或类似的代码。基本上,如果有错误,则输出错误推理,如果没有错误,则继续并执行subprocess.Popen。如果子流程打印出任何错误消息,则用户可能会看到。这就是你所说的“推理”吗?谢谢你的帮助,现在我可以用shell=False运行加密部分了。然而,我仍然有错误检查的问题。即使文件不存在,子流程仍将执行并打印创建的文件。你有什么想法吗?试试子流程。check_output
便利例程,它创建Popen对象,收集其输出并检查错误,一次完成。或者如果你不想从命令中获得输出,请使用子流程。改为check_call
。嘿,如果你有时间,另一个快速问题。是否可以使用subprocess.check_输出为if语句返回错误代码?例如,如果subprocess.check_output==错误代码0或类似的代码。基本上,如果有错误,则输出错误推理,如果没有错误,则继续并执行subprocess.Popen。如果子流程打印出任何错误消息,则用户可能会看到。这就是你所说的“推理”吗?
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)
subprocess.Popen \
(
[
"openssl", "aes-128-cbc", "-salt",
"-in", os.path.join(SrcDIR, var1),
"-out", os.path.join(DstDIR, "enc." + var1),
"-k", var2
]
)