[Tutor] Redirecting output + calling dos commands with input tail

Lloyd Kvam pythontutor@venix.com
Tue Jun 17 19:15:06 2003


Your instr function could be replaced by an intrinsic python method.

p=instr(cmd,">")  # becomes
p=cmd.find(">")

find returns -1 if there is no match.  Your instr function assumes that 0
is a safe return value, but in other contexts you would not be able to
distinguish between found in the first (zeroth) position and not found at all.

Since a cmd can not legally begin with >, it isn't a problem here.

cino hilliard wrote:
> Hi,
> First thanks Rick for asking the question.
> 
> Magnus, maybe you can help me. The module below has functions that call 
> dos commands.
> 
> pycall('dir') will list the current folder directory but all jumbled up.
> pycall('dir>dir.txt') will list the current folder directory to file 
> dir.txt nice and neat.
> pycall('start excel') starts Excel.
> pycall('start winword') starts Ms word.
> pycall('start maplew8')   starts maple8
> pycall('start p2017.exe') starts pari ver 2017
> etc.
> 
> To see the dos shell commands type help at the cmd console prompt
> c:\pari>help
> For more information on a specific command, type HELP command-name
> ASSOC    Displays or modifies file extension associations.
> AT       Schedules commands and programs to run on a computer.
> ATTRIB   Displays or changes file attributes.
> [Snip]
> 
> pypari('primes(100)') list the first 100 primes. Output here isn't bad.
> 
>>>> pypari('primes(100)')
>>>
> ['? [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 
> 67, 71,
> 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 
> 151, 157,
> 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 
> 239, 241,
> 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 
> 337, 347,
> 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 
> 433, 439,
> 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 
> 541]\n',
> '? ']
> 
>>>> pypari('factor(2^128+1)') factors the 8th Fermat prime
>>>
> ['? \n', '[59649589127497217 1]\n', '\n', '[5704689200685129054721 
> 1]\n', '\n',
> '? ']
> 
> There we have it. Python is as powerful as Pari.
> 
> Questions.
> 1. can the technique you used to help Rick (see redir() in the shell 
> module) be used in shell to
> to make pycall and pypari do what they do  here? Give me some help on 
> exiting processes.
> 
> 2. can the dos console output be formatted to be pretty eg., dir, help etc?
> 
> 3. When I make a modification to shell.py I have to close the current 
> python.exe chevron >>>
> window and start another and  from shell import * again or open another 
>  >>> and from shell import *
> Any way around this? I want to keep the last >>> because the previous 
> commands can be
> retreived with f3 and the arrow keys. The import shell.pycall etc 
> doesn't work in xp pro p4 either.
> 
> 4. Wish list. Right string,left string,mid string functions, etc  built 
> in. see my instr() below
> 
> Thanks for all your work
> 
> #********************************The Shell Game 
> shell.py***************************
> #Usage: >>> from shell import *
> # pycall('cmd[>]')
> #pypari('function')
> 
> import os
> import sys
> def popen2(cmd, bufsize=-1, mode='t'):       #use popen2 to perform dos 
> shell operations
>    w,r = os.popen2(cmd, mode, bufsize)
>    return r,w
> 
> def pycall(cmd):                             #call a dos file or command
>    r,w = popen2(cmd)                   #seems to require both r,w
>    getit = r.readlines()
>    print(getit)
> 
> def pypari(cmd):                              #call and execute a pari 
> command
>    f=open("pari.txt","w")                    #save command to a file
>    p=instr(cmd,">")                          #check for dos redirection 
> ">" command
>    if p > 0:                                 #if ">" exists then write 
> it to file
>       f.write(cmd[:p])
>    else:                                     #otherwise just write pari 
> command to file
>       f.write(cmd)
>       paristr = 'c:\pari\p -q <pari.txt'     #save the pari path with < 
> file parameter
>    f.close()
>    if p > 0:                                       #if you want to 
> redirect pari output to
>       paristr = 'c:\pari\p -q <pari.txt' + cmd[p:] #a file append the > 
> and file you put in cmd
>       print paristr                                 #show some output 
> for sanity
>    r,w = popen2(paristr)
>    getit = r.readlines()
>    print(getit)
> 
> def redir(cmd):                              #redirect output to a file. 
> I attempted to
>    oldout = sys.stdout                      #use this method to do the 
> above to no avail.
>    print 'redirecting'
>    sys.stdout = open(cmd,'w')
>    print 'this text to file',cmd
>    sys.stdout.close()
>    sys.stdout = oldout
>    print 'back to normal'
> 
> 
> def instr(str,chr):                         #instr() get the position of 
> a single character in a string
>   ln = len(str)
>   pos = 0
>   for i in range(ln):
>       if str[i] == chr:
>          pos=i
>          break
>   return pos
> 
> 
> 
>  3         3        3         3        3        6            
> 2               (0^0)
> 2   +  13  +  33  +  43  =  49   =  7    =  343   = 117649
> 
> _________________________________________________________________
> MSN 8 helps eliminate e-mail viruses. Get 2 months FREE*.  
> http://join.msn.com/?page=features/virus
> 
> 
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> http://mail.python.org/mailman/listinfo/tutor
> 


-- 
Lloyd Kvam
Venix Corp.
1 Court Street, Suite 378
Lebanon, NH 03766-1358

voice:	603-443-6155
fax:	801-459-9582