如何通过 Stdin 参数将字符串传送到 subprocess.Popen
subprocess.Popen 函数使 Python 脚本能够生成新进程并与其标准输入、输出和错误进行交互。一种常见的用例涉及通过其 stdin 向子进程传递数据,这可以通过在对象创建期间指定 stdin=PIPE 来实现。
但是,尝试使用 cStringIO.StringIO 对象作为 stdin 流会导致错误,因为它缺少 subprocess.Popen 所需的 fileno 属性。要解决此问题,请使用以下技术:
使用 Popen.communicate()
根据官方文档,Popen.communicate() 期望传递数据通过输入参数,而不是标准输入流。将代码修改为:
from subprocess import Popen, PIPE, STDOUT p = Popen(['grep', 'f'], stdout=PIPE, stdin=PIPE, stderr=STDOUT) grep_stdout = p.communicate(input=b'one\ntwo\nthree\nfour\nfive\nsix\n')[0] print(grep_stdout.decode())
使用 subprocess.run (Python 3.5 )
对于 Python 3.5 及以上版本,subprocess.run 提供了一种简化的管理方式子流程。它允许您在单个函数调用中传递字符串输入并获取字符串输出:
#!/usr/bin/env python3 from subprocess import run, PIPE p = run(['grep', 'f'], stdout=PIPE, input='one\ntwo\nthree\nfour\nfive\nsix\n', encoding='ascii') print(p.returncode) print(p.stdout)
通过采用这些方法,您可以通过 stdin 参数有效地将字符串传递到 subprocess.Popen 中,使您的程序能够与外部流程无缝交互。
以上是如何将字符串通过管道传输到 subprocess.Popen 的标准输入?的详细内容。更多信息请关注PHP中文网其他相关文章!