你可以在Python的MS Windows上打开stdin作为文件吗?

时间:2012-01-22 07:06:59

标签: python windows linux stdin

在Linux上,我正在使用supbprocess.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)特定的解决方案?

4 个答案:

答案 0 :(得分:2)

您不应该使用'/dev/stdin',而应使用sys.stdin

答案 1 :(得分:2)

如果myapp-视为表示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')作为stderr传递给Popen

答案 2 :(得分:1)

黑暗中的总镜头,但是con:是控制台设备的名称(你知道,DOS中的好{'copy con newfile.txt)。您可以将con:作为参数传递给不接受' - '的程序。

答案 3 :(得分:0)

请使用

  

导入sys

     

sys.stdout.write函数( “ABC \ N123 \ n” 个)

  

表示sys.stdin.readlines()中的行:

     

...打印行

例如