首页 >后端开发 >Python教程 >如何将字符串通过管道传输到 subprocess.Popen 的标准输入?

如何将字符串通过管道传输到 subprocess.Popen 的标准输入?

Susan Sarandon
Susan Sarandon原创
2024-12-08 18:31:10529浏览

How Can I Pipe a String to subprocess.Popen's stdin?

如何通过 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn