在 Linux 上,我使用 subbprocess.Popen 来运行应用程序。该应用程序的命令行需要输入文件的路径。我了解到我可以将路径 /dev/stdin 传递到命令行,然后使用 Python 的 subproc.stdin.write() 将输入发送到子进程。
import subprocess
kw['shell'] = False
kw['executable'] = '/path/to/myapp'
kw['stdin'] = subprocess.PIPE
kw['stdout'] = subprocess.PIPE
kw['stderr'] = subprocess.PIPE
subproc = subprocess.Popen(['','-i','/dev/stdin'],**kw)
inbuff = [u'my lines',u'of text',u'to process',u'go here']
outbuff = []
conditionbuff = []
def processdata(inbuff,outbuff,conditionbuff):
for i,line in enumerate(inbuff):
subproc.stdin.write('%s\n'%(line.encode('utf-8').strip()))
line = subproc.stdout.readline().strip().decode('utf-8')
if 'condition' in line:
conditionbuff.append(line)
else:
outbuff.append(line)
processdata(inbuff,outbuff,conditionbuff)
该应用程序还有 MS Windows 版本。 MS Windows 上是否有与使用 /dev/stdin 等效的方法,或者是 Linux (Posix) 特定的解决方案?
If myapp
treats -
作为表示 stdin 的特殊文件名:
from subprocess import PIPE, Popen
p = Popen(['/path/to/myapp', '-i', '-'], stdin=PIPE, stdout=PIPE)
stdout, _ = p.communicate('\n'.join(inbuff).encode('utf-8'))
outbuff = stdout.decode('utf-8').splitlines()
如果你无法通过-
那么你可以使用临时文件:
import os
import tempfile
with tempfile.NamedTemporaryFile(delete=False) as f:
f.write('\n'.join(inbuff).encode('utf-8'))
p = Popen(['/path/to/myapp', '-i', f.name], stdout=PIPE)
outbuff, conditionbuff = [], []
for line in iter(p.stdout.readline, ''):
line = line.strip().decode('utf-8')
if 'condition' in line:
conditionbuff.append(line)
else:
outbuff.append(line)
p.stdout.close()
p.wait()
os.remove(f.name) #XXX add try/finally for proper cleanup
压制stderr
你可以通过open(os.devnull, 'wb')
as stderr
to Popen
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)