将字符串输入传递给 subprocess.Popen
尝试将 StringIO 对象作为标准输入传递给 subprocess.Popen 时遇到的错误表明 StringIO子进程不会将对象识别为有效的类文件对象。要解决此问题并成功将字符串作为标准输入传递,需要首先创建到 Popen 进程的管道。
使用显式管道创建
子进程。 Communications() 文档建议使用 stdin=PIPE 创建一个管道,以将数据发送到进程的 stdin。这可以通过修改代码来实现,如下所示:
import subprocess 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())
此代码创建一个到 grep 进程的管道,允许输入字符串通过 stdin 参数传递。
使用 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)
此方法提供了显式管道创建方法的简洁替代方法。
以上是如何将字符串作为标准输入传递给 subprocess.Popen?的详细内容。更多信息请关注PHP中文网其他相关文章!