代码之家  ›  专栏  ›  技术社区  ›  somerandomguy95

Python子进程。使用shell处理Popen错误=真/假问题

  •  1
  • somerandomguy95  · 技术社区  · 7 年前

    在生产线子流程中。波本。。。。。。如果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 回复  |  直到 7 年前
        1
  •  0
  •   Lawrence D'Oliveiro    7 年前

    如果您设置 shell arg到 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
        ]
      )
    

    这也比用 = True

        2
  •  0
  •   Eric Aya Duarte    6 年前

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

    除此之外,劳伦斯·奥利维罗(LawrenceD'Oliveiro)在使用列表与单个字符串的优势方面是正确的。