Newbie question about sending and receiving data to the command prompt.

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Sun Aug 24 07:49:37 EDT 2008


En Fri, 22 Aug 2008 18:25:49 -0300, n00m <n00m at narod.ru> escribió:

> Is it possible to communicate in loop fashion?
>
> ====================================
> import subprocess as s
> proc = s.Popen('cmd.exe', stdin=s.PIPE, stdout=s.PIPE)
> while 1:
>     cmd = raw_input('cmd:')
>     res = proc.communicate(cmd + '\n')[0]
>     print res
> ====================================

Don't use communicate, it waits for the process to finish.
But you can write and read from the pipes. The hard part is to recognize *where* output from the previous command ends (so you don't read further). The code below uses #\n as the prompt:

import subprocess as s

def read_output(stdout):
  while 1:
    line = stdout.readline()
    if not line: break
    line = line.rstrip('\r\n')
    if line=='#': break
    yield line

proc = s.Popen('cmd.exe /k prompt #$_', stdin=s.PIPE, stdout=s.PIPE)
for line in read_output(proc.stdout): pass # skip over initial prompt
while 1:
  cmd = raw_input('cmd:')
  proc.stdin.write(cmd+'\n')
  for line in read_output(proc.stdout):
    print line

-- 
Gabriel Genellina




More information about the Python-list mailing list