Subprocess module: running an interactive shell

Roman Medina-Heigl Hernandez roman at rs-labs.com
Sat Mar 14 06:03:00 EDT 2009


Karthik Gurusamy escribió:
> On Mar 13, 6:39 pm, Roman Medina-Heigl Hernandez <ro... at rs-labs.com>
> wrote:
>> Hi,
>>
>> I'm experimenting with Python and I need a little help with this. What I'd
>> like is to launch an interactive shell, having the chance to send first
>> several commands from python. I've written the following code:
>>
>> =============
>>
>> #!/usr/bin/env python
>>
>> import sys, subprocess
>>
>> exe = "/bin/sh"
>> params = "-i"
> 
> -i says shell to be interactive. So looks like it is directly trying
> to read from the terminal.

Well, then the question will be: is there any way to tell python to
directly "map" the terminal to the subprocess?

>> proc = subprocess.Popen([exe, params], stdin=subprocess.PIPE)
> 
> proc = subprocess.Popen([exe,], stdin=subprocess.PIPE)
> 
> works for me; but if there is an error 'sh' terminates.
> 
> If you want to simulate interactive, explore the pexpect module.

I'll get it a try :)))

>> proc.stdin.write("id\n")
>>
>> while True:
>>         line = sys.stdin.readline()
>>         if not line:
> 
> note that a simple enter terminates the shell which you may not want.

Test my code and you'll see that this is not true :) When you hit enter
line will contain '\n' so it's not empty.

>>                 break
>>         proc.stdin.write(line)

Btw, another curiosity I have: is it possible to make a print not
automatically add \n (which is the normal case) neither " " (which happens
when you add a "," to the print sentence)?  I found an alternative not
using print at all, eg: sys.stdout.write("KKKKK"). But it resulted strange
to me having to do that trick :)

Thank you for all your comments and comprenhension.

-r

>> sys.exit()
>>
>> =============
>>
>> The problem is that when I launch it, python proggy is automatically
>> suspended. The output I got is:
>>
>> roman at rslabs:~/pruebas$ ./shell.py
>> roman at rslabs:~/pruebas$ uid=1000(roman) gid=1000(roman) groups=1000(roman)
>> roman at rslabs:~/pruebas$
>>
>> [2]+  Stopped                 ./shell.py
>> roman at rslabs:~/pruebas$
>>
>> Why and how to fix it? Would you suggest a better and more elegant way to
>> do what I want?
> 
> As I see it, 'sh' is attempting to read from the keyboard and not from
> stdin.
> 
> Karthik
> 
>> Thank you.
>>
>> --
>>
>> Saludos,
>> -Roman
>>
>> PGP Fingerprint:
>> 09BB EFCD 21ED 4E79 25FB  29E1 E47F 8A7D EAD5 6742
>> [Key ID: 0xEAD56742. Available at KeyServ]
> 
> --
> http://mail.python.org/mailman/listinfo/python-list

-- 

Saludos,
-Roman

PGP Fingerprint:
09BB EFCD 21ED 4E79 25FB  29E1 E47F 8A7D EAD5 6742
[Key ID: 0xEAD56742. Available at KeyServ]



More information about the Python-list mailing list