gpt4 book ai didi

python - 为什么 shell=True 在管道命令一起工作时起作用?

转载 作者:太空宇宙 更新时间:2023-11-04 01:29:03 25 4
gpt4 key购买 nike

我有几个 subprocess 实例,我想将它们串联成一个管道,但我被卡住了,想寻求建议。

例如模仿:

cat data | foo - | bar - > result

或者:

foo - < data | bar - > result

...我首先尝试了以下挂起:

import subprocess, sys

firstProcess = subprocess.Popen(['foo', '-'], stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
secondProcess = subprocess.Popen(['bar', '-'], stdin=firstProcess.stdout,
stdout=sys.stdout)

for line in sys.stdin:
firstProcess.stdin.write(line)
firstProcess.stdin.flush()

firstProcess.stdin.close()
firstProcess.wait()

我的第二次尝试使用一个带有 shell=True 参数的 subprocess 实例,它有效:

import subprocess, sys

pipedProcess = subprocess.Popen(" ".join(['foo', '-', '|', 'bar', '-']),
stdin=subprocess.PIPE, shell=True)

for line in sys.stdin:
pipedProcess.stdin.write(line)
pipedProcess.stdin.flush()

pipedProcess.stdin.close()
pipedProcess.wait()

第一个链式 subprocess 方法我做错了什么?我读到最好不要使用 shell=True 并且我很好奇我在第一种方法中做错了什么。感谢您的建议。

编辑

我修正了问题中的错字并修正了 secondProcessstdin 参数。它仍然挂起。

我还尝试删除解决挂起问题的 firstProcess.wait(),但随后我得到一个 0 字节的文件作为 result

我会坚持使用 pipedProcess,因为它工作正常。但是,如果有人知道为什么第一个设置挂起或生成一个 0 字节文件作为输出,我也很想知道为什么。

最佳答案

shell=True 之所以有效,是因为您要求 shell 解释整个命令行并自行处理管道。它实际上就像您键入 foo - | bar - 直接进入 shell。

(这也是使用 shell=True 可能不安全的原因;有很多方法可以欺骗 shell 做一些如果您直接传递命令和参数就不会发生的坏事作为不受任何中介解析的列表。)

关于python - 为什么 shell=True 在管道命令一起工作时起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15374146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com