如何在 Python 3 中使用 stdin 将字符串传递给 subprocess.run

Posted

技术标签:

【中文标题】如何在 Python 3 中使用 stdin 将字符串传递给 subprocess.run【英文标题】:How do I pass a string in to subprocess.run using stdin in Python 3 【发布时间】:2018-07-22 22:59:43 【问题描述】:

这肯定是作为关于其他地方子流程的长时间讨论的一部分来回答的。但是答案太简单了,应该破解。

如果我使用 Python 3 的 subprocess.run(),如何将字符串“foo”传递给在标准输入上期望它的程序?

【问题讨论】:

【参考方案1】:

text=Trueinput="whatever string you want" 传递给subprocess.run

import subprocess
subprocess.run("cat", text=True, input="foo\n")

根据subprocess.run 的文档:

input 参数被传递给Popen.communicate(),从而传递给子进程的标准输入。如果使用它必须是字节序列,或者如果指定了 encodingerrorstext 为真,则为字符串。使用时,内部Popen 对象会自动使用stdin=PIPE 创建,并且可能不使用stdin 参数。


universal_newlines 在 Python 3.7 中被重命名为 text,所以在旧版本上你必须使用 universal_newlines=True 而不是 text=True

subprocess.run("cat", universal_newlines=True, input="foo\n")

如果您希望命令的输出为字符串,您可能需要添加capture_output=True

subprocess.run("cat", universal_newlines=True, capture_output=True, input="foo\n")

【讨论】:

capture_output 也是 Python 3.7 的新增功能,因此如果您使用的是 Universal_newlines,您还需要直接使用 stderr 和 stdout - ***.com/questions/53209127/…【参考方案2】:

最简单的例子,将foo 发送到cat 并让它打印到屏幕上。

 import subprocess

 subprocess.run(['cat'],input=b'foo\n')

注意你发送二进制数据和回车。

【讨论】:

以上是关于如何在 Python 3 中使用 stdin 将字符串传递给 subprocess.run的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 3 中使用 sys.stdin 进行文本处理时,我应该如何处理 BOM?

如何中止在 python3 中等待 sys.stdin?

如何使用 PHP 将字节流发送到套接字?

如何在使用os.execl替换进程时重定向stdin / stdout / stderr

如何完成 sys.stdin.readlines() 输入?

python 3中最快的标准输入/输出IO?