如何在 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=True
和input="whatever string you want"
传递给subprocess.run
:
import subprocess
subprocess.run("cat", text=True, input="foo\n")
根据subprocess.run
的文档:
input 参数被传递给
Popen.communicate()
,从而传递给子进程的标准输入。如果使用它必须是字节序列,或者如果指定了 encoding 或 errors 或 text 为真,则为字符串。使用时,内部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?
如何在使用os.execl替换进程时重定向stdin / stdout / stderr