Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Spawn/Exec with asterisk in argument

7 views
Skip to first unread message

jere...@gmail.com

unread,
Apr 18, 2007, 8:35:43 PM4/18/07
to
The spawn* and exec* functions appear to escape asterisks, I'm
guessing all shell characters too, before the spawn/exec'ed process
sees them. Is there a way around this?

Not sure if this is a bug or a "feature".

user$ touch test.txt
user$ ls -l *
-rw-r--r-- 1 user user 0 Apr 18 18:30 test.txt
user$ ls -l \*
ls: *: No such file or directory
user$ python
Python 2.3.5 (#1, Aug 12 2006, 00:08:11)
[GCC 4.0.1 (Apple Computer, Inc. build 5363)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.system("ls -l *")
-rw-r--r-- 1 user user 0 Apr 18 18:30 test.txt
0
>>> os.spawnvp(os.P_WAIT, "ls", ("ls", "-l", "*"))
ls: *: No such file or directory
1

Michael Hoffman

unread,
Apr 18, 2007, 9:24:11 PM4/18/07
to
jere...@gmail.com wrote:
> The spawn* and exec* functions appear to escape asterisks, I'm
> guessing all shell characters too, before the spawn/exec'ed process
> sees them.

No. It is the shell that ordinarily processes these characters and gives
them a special meaning. On most systems, ls does not give any special
meaning to asterisk.

> Is there a way around this?

If you want to process asterisk the way the shell does, you can pass
things through the shell. os.system is one way of doing that. Probably
better is:

subprocess.check_call("ls -l *", shell=True)

Another way is using the glob module (and optionally
os.path.expanduser() for tilde expansion and os.path.expandvars() for
variable expansion, other things that are normally taken care of by the
shell).
--
Michael Hoffman

jere...@gmail.com

unread,
Apr 19, 2007, 3:29:35 PM4/19/07
to
On Apr 18, 7:24 pm, Michael Hoffman <cam.ac...@mh391.invalid> wrote:

> If you want to process asterisk the way the shell does, you can pass
> things through the shell. os.system is one way of doing that. Probably
> better is:
>
> subprocess.check_call("ls -l *", shell=True)

Thanks for the reply Michael. I used ls as a simple example, but I'm
using this with scp to transfer files and need shell expansion. It
makes sense since the shell isn't spawning the process, but it's been
a while since I've worked with ipc. I had converted to os.system
before posting, but subprocess gives me more control than I originally
hoped for

Thanks again

Michael Hoffman

unread,
Apr 19, 2007, 5:28:58 PM4/19/07
to
jere...@gmail.com wrote:

> Thanks for the reply Michael.

No problem.

> I used ls as a simple example, but I'm
> using this with scp to transfer files and need shell expansion. It
> makes sense since the shell isn't spawning the process, but it's been
> a while since I've worked with ipc.

I usually don't think of starting new processes as being IPC. I've only
ever seen it used to refer to communicating between processes after they
have started.
--
Michael Hoffman

0 new messages