如何使用Python的subprocess.run()通过stdin传入字符串?
用Python的subprocess.run()通过stdin传入字符串的方法
刚好我经常处理这类场景,给你详细说下怎么操作,尤其是给需要stdin输入的程序传"foo"的具体例子。
首先,subprocess.run()提供了非常直接的方式传递stdin输入,核心是利用input参数配合text=True(或者旧版的universal_newlines=True)来简化字符串和字节的转换。
基础示例:调用需要stdin的Python脚本
假设我们有一个简单的脚本test_input.py,它从stdin读取输入并打印:
# test_input.py received = input("请输入内容: ") print(f"收到输入: {received}")
现在用subprocess.run()调用它,并传入"foo":
import subprocess # 调用脚本并传入字符串"foo" result = subprocess.run( ["python", "test_input.py"], input="foo", # 直接传字符串 text=True, # 自动处理字符串<->字节的转换 capture_output=True # 捕获stdout和stderr,方便查看结果 ) # 打印程序的输出 print(result.stdout.strip()) # 输出:收到输入: foo
调用外部命令的示例
如果是调用系统命令(比如Unix的cat,它会读取stdin并输出),用法完全一致:
import subprocess # 给cat命令传入"foo" result = subprocess.run( ["cat"], input="foo", text=True, capture_output=True ) print(result.stdout.strip()) # 输出:foo
注意事项
- 字节 vs 字符串:如果不设置
text=True,你需要把字符串编码成字节串,比如input=b"foo"(默认用utf-8编码)。 - 多行输入:如果需要传递多行字符串,直接在input里写换行符就行,比如
input="foo\nbar\n"。 - 旧版本Python兼容:Python 3.7之前没有
text=True,可以用universal_newlines=True替代,效果是一样的。 - 捕获输出:如果不需要捕获程序的输出,可以去掉
capture_output=True,但如果你想查看程序返回的内容或者错误信息,这个参数很有用。
内容的提问来源于stack exchange,提问作者Ray Salemi
相关产品推荐
相关产品推荐

