你能用Python在MS Windows上打开stdin文件吗?

2024-04-26 12:24:58 发布

您现在位置:Python中文网/ 问答频道 /正文

在Linux上,我使用超级进程。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)

这个应用还有一个微软Windows版本。在MS Windows上是否有与使用/dev/stdin等效的方法,或者是Linux(Posix)特定的解决方案?在


Tags: 命令行dev应用程序进程linuxstdinlinesubprocess
3条回答

如果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()

如果无法传递-,则可以使用临时文件:

^{pr2}$

为了抑制stderr,可以将open(os.devnull, 'wb')作为stderr传递给Popen。在

完全是瞎猜的,但是con:是控制台设备的名称(你知道,DOS中的好ol'copy con newfile.txt)。您可以将con:作为参数传递给不接受“-”的程序。在

请使用

import sys

sys.stdout.write("Abc\n123\n")

或者

for line in sys.stdin.readlines():

... print line

例如

相关问题 更多 >