【发布时间】:2015-04-21 08:48:20
【问题描述】:
我需要做类似this post 的事情,但我需要创建一个可以多次输入和输出的子进程。该帖子的接受答案具有良好的代码...
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())
# four
# five
...我想继续这样:
grep_stdout2 = p.communicate(input=b'spam\neggs\nfrench fries\nbacon\nspam\nspam\n')[0]
print(grep_stdout2.decode())
# french fries
但是很遗憾,我收到以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/subprocess.py", line 928, in communicate
raise ValueError("Cannot send input after starting communication")
ValueError: Cannot send input after starting communication
如果我理解正确的话,proc.stdin.write() 方法不能让您收集输出。保持线路畅通以进行持续输入/输出的最简单方法是什么?
编辑:=====================
看起来pexpect 对我正在尝试做的事情来说是一个有用的库,但我无法让它工作。这是对我的实际任务的更完整的解释。我正在使用hfst 对单个(俄语)单词进行语法分析。下面演示了它在 bash shell 中的行为:
$ hfst-lookup analyser-gt-desc.hfstol
> слово
слово слово+N+Neu+Inan+Sg+Acc 0.000000
слово слово+N+Neu+Inan+Sg+Nom 0.000000
> сработай
сработай сработать+V+Perf+IV+Imp+Sg2 0.000000
сработай сработать+V+Perf+TV+Imp+Sg2 0.000000
>
我希望我的脚本能够一次分析一种表单。我试过这样的代码,但它不起作用。
import pexpect
analyzer = pexpect.spawnu('hfst-lookup analyser-gt-desc.hfstol')
for newWord in ['слово','сработай'] :
print('Trying', newWord, '...')
analyzer.expect('> ')
analyzer.sendline( newWord )
print(analyzer.before)
# trying слово ...
#
# trying сработай ...
# слово
# слово слово+N+Neu+Inan+Sg+Acc 0.000000
# слово слово+N+Neu+Inan+Sg+Nom 0.000000
#
#
我显然误解了pexpect.before 的作用。如何获得每个单词的输出,一次一个?
【问题讨论】:
-
"proc.stdin.write() 方法不能让你收集输出," 你仍然可以得到输出,你只需要从 proc.stdout 和 proc.stderr 中得到它。
-
这是windows还是linux?在 linux 上,pexpect 模块是子进程交互的不错选择。
-
你想做什么?
-
如果你想要“多输入多输出”必读:Q: Why not just use a pipe (popen())?
-
顺序应该是: 0. 等待第一个提示 1. 发送单词 2. 等待提示,得到单词的响应(
.after?) 3. 重复1-2跨度>
标签: python subprocess stdout stdin pexpect