What about having a thread which reads from subprocess.Popen()'s stdout...instead of read/write, read/write. just always read, and write when needed?
any comments on that idea? jas wrote: > actually, i can't check for ">" only because if you a dir, a line can > end with a > but is not the end of the output > > jas wrote: > > Thanks, that is certainly a start. As you mentioned, the "cd" could is > > an issue. > > > > Perhaps checking to see if the line ends with ">" is sufficient? > > > > Dennis Lee Bieber wrote: > > > On 24 Oct 2005 07:20:42 -0700, "jas" <[EMAIL PROTECTED]> declaimed the > > > following in comp.lang.python: > > > > > > > Hi, > > > > I would like to start a new process and be able to read/write from/to > > > > it. I have tried things like... > > > > > > > > import subprocess as sp > > > > p = sp.Popen("cmd.exe", stdout=sp.PIPE) > > > > p.stdin.write("hostname\n") > > > > > > > > however, it doesn't seem to work. I think the cmd.exe is catching it. > > > > > > One: you didn't read any of the "returned" output... > > > > > > Two: the output only seems to be available upon EOF, which means the > > > spawned command processor has to exit first... Though you CAN read one > > > character at a time, and then have to build lines and expected prompt > > > strings... > > > > > > > > > This seems to work: > > > -=-=-=-=-=-=-=-=- > > > import subprocess > > > import os > > > > > > PROMPT = os.getcwd() + ">" > > > > > > def getLine(proc): > > > ld = [] > > > while True: > > > c = proc.stdout.read(1) > > > if c == "\r": continue #skip Windows <cr> > > > if c != "\n": ld.append(c) #save all but <lf> > > > if c is None or c == "\n" or c == ">": break > > > ln = "".join(ld) > > > return ln > > > > > > p = subprocess.Popen("cmd.exe", stdout=subprocess.PIPE, stdin = > > > subprocess.PIPE) > > > > > > print "**** START of captured output" > > > while True: > > > ln = getLine(p) > > > print ln > > > if ln == PROMPT: break > > > print "**** END of captured output" > > > > > > p.stdin.write("ipconfig\n") > > > print "**** START of captured output" > > > while True: > > > ln = getLine(p) > > > print ln > > > if ln == PROMPT: break > > > print "**** END of captured output" > > > > > > p.stdin.write("dir\n") > > > print "**** START of captured output" > > > while True: > > > ln = getLine(p) > > > print ln > > > if ln == PROMPT: break > > > print "**** END of captured output" > > > > > > p.stdin.write("exit\n") > > > -=-=-=-=-=-=-=-=-=- > > > E:\UserData\Dennis Lee Bieber\My Documents>python script1.py > > > **** START of captured output > > > Microsoft Windows XP [Version 5.1.2600] > > > (C) Copyright 1985-2001 Microsoft Corp. > > > > > > E:\UserData\Dennis Lee Bieber\My Documents> > > > **** END of captured output > > > **** START of captured output > > > ipconfig > > > > > > Windows IP Configuration > > > > > > > > > Ethernet adapter Local Area Connection: > > > > > > Connection-specific DNS Suffix . : > > > IP Address. . . . . . . . . . . . : 192.168.1.100 > > > Subnet Mask . . . . . . . . . . . : 255.255.255.0 > > > IP Address. . . . . . . . . . . . : fe80::211:11ff:fee1:f303%4 > > > Default Gateway . . . . . . . . . : 192.168.1.1 > > > > > > Tunnel adapter Teredo Tunneling Pseudo-Interface: > > > > > > Connection-specific DNS Suffix . : > > > IP Address. . . . . . . . . . . . : > > > 3ffe:831f:4004:1956:0:fbde:bd0a:e50b > > > IP Address. . . . . . . . . . . . : fe80::5445:5245:444f%5 > > > Default Gateway . . . . . . . . . : :: > > > > > > Tunnel adapter Automatic Tunneling Pseudo-Interface: > > > > > > Connection-specific DNS Suffix . : > > > IP Address. . . . . . . . . . . . : fe80::5efe:192.168.1.100%2 > > > Default Gateway . . . . . . . . . : > > > > > > E:\UserData\Dennis Lee Bieber\My Documents> > > > **** END of captured output > > > **** START of captured output > > > dir > > > Volume in drive E is Data > > > Volume Serial Number is 2626-D991 > > > > > > Directory of E:\UserData\Dennis Lee Bieber\My Documents > > > > > > 10/24/2005 09:23 AM <DIR> > > > . > > > 10/24/2005 09:23 AM <DIR> > > > .. > > > 07/25/2005 10:39 PM <DIR> > > > .metadata > > > 10/06/2005 09:54 AM <DIR> > > > Ada Progs > > > 08/13/2005 02:01 PM <DIR> > > > Agent Data > > > 10/21/2005 09:29 AM 421,820 apress_offer.pdf > > > 07/03/2005 11:36 AM 132 cp.py > > > 07/17/2005 12:25 PM <DIR> > > > Cyberlink > > > 07/06/2005 09:32 AM 102,400 db1.mdb > > > 07/26/2005 12:20 AM 26,614 eclipse_code.xml > > > 10/24/2005 01:08 AM <DIR> > > > Eudora > > > 06/24/2005 08:50 PM 667 fake_oosums.ads > > > 06/24/2005 08:50 PM 695 fake_oosums.ali > > > 09/06/2005 09:01 PM <DIR> > > > Genealogy > > > 07/13/2005 10:56 PM <DIR> > > > HomeSite > > > 05/08/2005 01:05 PM <DIR> > > > Investing > > > 10/21/2005 10:04 PM <DIR> > > > Java Progs > > > 08/04/2005 10:13 PM 162 main.py > > > 10/11/2005 10:43 PM <DIR> > > > My Downloads > > > 05/01/2005 10:31 AM <DIR> > > > My eBooks > > > 04/22/2005 12:09 AM <DIR> > > > My Music > > > 07/10/2005 11:43 AM <DIR> > > > My Pictures > > > 06/29/2005 11:55 PM <DIR> > > > My PSP Files > > > 05/23/2005 09:30 AM <DIR> > > > My Videos > > > 05/01/2005 12:49 PM <DIR> > > > Office Documents > > > 06/27/2005 03:19 PM 7,961,778 > > > org.eclipse.jdt.doc.user.I20050627-1435.pdf > > > 06/27/2005 03:19 PM 6,791,109 > > > org.eclipse.platform.doc.user.I20050627-1435.pdf > > > 10/11/2005 10:52 PM 56 oth_tsr_rm_750.ram > > > 07/20/2005 09:32 AM 108,457 parkerred15yc.jpg > > > 09/03/2005 10:36 PM <DIR> > > > Python Progs > > > 10/20/2005 10:38 PM <DIR> > > > Quicken > > > 07/10/2005 12:09 PM 3,356,248 results.xml > > > 06/11/2005 12:03 PM 935 Scout_Ship Database.lnk > > > 07/03/2005 12:38 PM <DIR> > > > Scout_Ship My Documents > > > 10/24/2005 09:23 AM 971 Script1.py > > > 09/25/2005 12:40 PM 1,107 Script1_old.py > > > 08/28/2005 11:47 AM <DIR> > > > SimpleMu Logs > > > 06/24/2005 08:56 PM 1,201 student_pack.ads > > > 06/24/2005 08:49 PM 1,144 student_pack.ads.0 > > > 06/24/2005 08:56 PM 1,342 student_pack.ali > > > 08/02/2005 11:39 PM 4,096 t.DOC > > > 06/20/2005 10:11 AM 104 t.rx > > > 08/05/2005 08:41 PM 66,452 Untitled-1.tif > > > 08/05/2005 08:41 PM <DIR> > > > VCheck > > > 10/03/2005 02:58 AM <DIR> > > > Visual Studio > > > 10/03/2005 02:51 AM <DIR> > > > Visual Studio 2005 > > > 21 File(s) 18,847,490 bytes > > > 25 Dir(s) 267,162,845,184 bytes free > > > > > > E:\UserData\Dennis Lee Bieber\My Documents> > > > **** END of captured output > > > > > > E:\UserData\Dennis Lee Bieber\My Documents> > > > > > > -=-=-=-=-=-=-=-=- > > > > > > Note that my "getLine()" has to return on either a real EOL, OR on > > > the end of a command prompt ("stuff>"). I also had to initialize the > > > prompt at the start. If someone issued a "cd" command to the subprocess, > > > the prompt would be all out of sequence, and the code would hang. > > > > > > You'll also note that the prompt /ends/ a capture sequence, and the > > > next command is the start of the /next/ capture sequence. > > > > > > -- > > > > ============================================================== < > > > > [EMAIL PROTECTED] | Wulfraed Dennis Lee Bieber KD6MOG < > > > > [EMAIL PROTECTED] | Bestiaria Support Staff < > > > > ============================================================== < > > > > Home Page: <http://www.dm.net/~wulfraed/> < > > > > Overflow Page: <http://wlfraed.home.netcom.com/> < -- http://mail.python.org/mailman/listinfo/python-list