How to spawn a program with redirection as it parameter

TH Lim sshark97 at hotmail.com
Thu Jul 10 18:48:45 CEST 2003


Thanks Donn, ur explaination sure put things into perspective. before
this, i was wandering why ">>" works in os.system() and not in
spawn().well, now i know why.

"Donn Cave" <donn at drizzle.com> wrote in message news:<1057291400.926913 at yasure>...
> Quoth sshark97 at hotmail.com (TH Lim):
> | How do I do a simple thing like  /bin/cat myfile.txt >> yourfile.txt
> | in unix? I tried with the script shown below but not successful. Am
> | doing it right? Pls. advise. thank you.
> |
> | #!/usr/bin/python
> | import os
> | os.spawnl(os.P_WAIT, "/bin/cat" , "/bin/cat", "myfile.txt >>
> | yourfile.txt")
> | print "Done"
> 
> No, the '>>' operator belongs to the shell, and in spawnl there
> is no shell.  As another followup observes, if you want a shell,
> you can use system() -
>   os.system('cat myfile.txt >> yourfile.txt')     is about the same as
>   os.spawnl(os.P_WAIT, '/bin/sh', 'sh', '-c', 'cat myfile.txt >> yourfile.txt')
> 
> Sometimes we would rather avoid the shell, because there's a risk
> that when it re-evaluates the command parameters they will come
> out different than we intend.  In that case, there isn't any standard
> function, you have to write your own.  Off the top of my head, maybe
> try something like
> 
>   def spawnvio(w, file, cmd, iodx):
>       pid = os.fork()
>       if pid:
>           if w == os.P_WAIT:
>               p, s = os.waitpid(pid, 0)
>               return s
>           else:
>               return pid
>       else:
>           try:
>               # Perform redirections
>               for n, u in iodx:
>                   if n != u:
>                       os.dup2(n, u)
>                       os.close(n)
>               os.execve(file, cmd, os.environ)
>           finally:
>               os._exit(113)
> 
>   yrf = os.open('yourfile.txt', os.O_APPEND|os.O_CREAT)
>   spawnvio(os.P_WAIT, '/bin/cat', ['cat', 'myfile.txt'], [(yrf, 1)])
>   os.close(yrf)
> 
> 	Donn Cave, donn at drizzle.com




More information about the Python-list mailing list