befuddled by os.exec functions

Donn Cave donn at
Fri Jul 23 06:58:46 CEST 2004

Quoth Avi Kak <kak at>:

|  1) How does one get one of the os.exec functions
|     in Python to execute a shell script that
|     includes some sort of a control structure in
|     the shell script itself?
|     For example, I can do the following in Perl
|     $ENV{ACK_MSG} = "You said: ";
|     exec('while a=a; do read MYINPUT; echo $ACK_MSG $MYINPUT; done');
|     How can one use one of the os.exec functions
|     in Python to do the same?  All of the os.exec
|     functions require a pathname for the first
|     argument, followed by well-defined arguments.
|     But the above example does not break down
|     into pathname and argument components.

As you probably know, the os (posix) module also provides a
system() function that does what you describe.  While that's
actually implemented by calling a C library function, this
would be about the same:

   def system(cmd):
        pid = os.fork()
        if pid:
                os.execve('/bin/sh', ['sh', '-c', cmd], os.environ)

That pathname and arguments are implicit in your example.
(Well, I don't know what your example actually does, since
I haven't used Perl for many years.)

|  2) In the following example, I am mystified as
|     to why the first element of the list in the
|     second argument has to be ignored.  If it is
|     going to be ignored anyway, why does it need
|     to be supplied at all?  The following call
|     does the same regardless of what one has in the
|     first element of the second-arg list.
|      os.execvp( 'ls', ['ls', '-al'] )

It's up to the application - some applications look at this
value, sys.argv[0] in Python, others don't.  "ls" may actually
use it for a "usage" message - try
   os.execvp('ls', ['xx', '--yikes'])

and then there are various situations where argv[0] is used
in some more significant way.  So it's useful to be able to
provide a value for argv[0] separately from the execution path.

	Donn Cave, donn at

More information about the Python-list mailing list