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

在Linux上,我使用supbprocess.Popen来运行一个应用程序。 该应用程序的命令行需要一个input文件的path。 我了解到我可以将path/ dev / stdin传递到命令行,然后使用Python的subproc.stdin.write()将input发送到subprocess。

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)特定解决scheme?

Solutions Collecting From Web of "你可以打开stdin作为MS Windows上的Python文件?"

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

你不应该使用'/dev/stdin'而是使用sys.stdin

在黑暗中总拍摄,但con:是控制台设备的名称(你知道,从DOS copy con newfile.txt )。 你可能可以通过con:作为参数给不接受' – '的程序。

请用

导入系统

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

要么

对于sys.stdin.readlines()中的行:

…打印线

例如