Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python subprocess.Popen错误处理shell=True/False问题_Python_Python 3.x_Subprocess_Popen_Ioerror - Fatal编程技术网

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

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

我正在尝试为以下代码获取一些错误处理

在子流程的行中。Popen。。。。。。如果shell=True,脚本将在给定正确文件名的情况下进行加密,但是没有具有该名称的文件,错误代码不会打印出来,但在终端上显示为没有现有文件/目录

如果运行shell=False,则无法加密文件,但会打印错误消息

有人能解释我做错了什么吗?正如我在这里看过不同的帖子,但我仍然不明白为什么它不起作用。我的猜测是它与脚本的shell=True部分有关

SrcDIR=“/home/test/testsource/”

DstDIR=“/home/test/testdest/”


如果将
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
    ]
  )