Quoth Avi Kak <ka*@purdue.edu >:
| 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:
...
else:
...
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,
do**@drizzle.co m