472,099 Members | 2,273 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,099 software developers and data experts.

subprocess.popen function with quotes

Hi,
i'm trying to call subprocess.popen on the 'rename' function in
linux. When I run the command from the shell, like so:

rename -vn 's/\.htm$/\.html/' *.htm

it works fine... however when I try to do it in python like so:
p = subprocess.Popen(["rename","-vn","'s/\.htm$/
\.html/'","*.htm"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)

print p.communicate()[0]

nothing gets printed out (even for p.communicate()[1])

I think the problem is the quoted string the rename command wants -
when I put it in triple quotes like """s/\.htm$/\.html/""" I get some
output, but not the correct output. I've also tried escaping the
single quotes with \' and putting it in regular double quotes but that
didn't work either.

i'd appreciate any help

Mar 26 '08 #1
7 4743
also, i've tried the Shell=True parameter for Popen, but that didn't
seem to make a difference

On Mar 25, 8:31 pm, skunkwerk <skunkw...@gmail.comwrote:
Hi,
i'm trying to call subprocess.popen on the 'rename' function in
linux. When I run the command from the shell, like so:

rename -vn 's/\.htm$/\.html/' *.htm

it works fine... however when I try to do it in python like so:
p = subprocess.Popen(["rename","-vn","'s/\.htm$/
\.html/'","*.htm"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)

print p.communicate()[0]

nothing gets printed out (even for p.communicate()[1])

I think the problem is the quoted string the rename command wants -
when I put it in triple quotes like """s/\.htm$/\.html/""" I get some
output, but not the correct output. I've also tried escaping the
single quotes with \' and putting it in regular double quotes but that
didn't work either.

i'd appreciate any help
Mar 26 '08 #2
En Wed, 26 Mar 2008 00:39:05 -0300, skunkwerk <sk*******@gmail.com>
escribió:
> i'm trying to call subprocess.popen on the 'rename' function in
linux. When I run the command from the shell, like so:

rename -vn 's/\.htm$/\.html/' *.htm

it works fine... however when I try to do it in python like so:
p = subprocess.Popen(["rename","-vn","'s/\.htm$/
\.html/'","*.htm"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)

print p.communicate()[0]

nothing gets printed out (even for p.communicate()[1])
I'd try with:

p = subprocess.Popen(["rename", "-vn", r"'s/\.htm$/\.html/'", "*.htm"],
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
shell=True)

(note that I added shell=True and I'm using a raw string to specify the
reg.expr.)

--
Gabriel Genellina

Mar 26 '08 #3
On Mar 25, 9:25*pm, "Gabriel Genellina" <gagsl-...@yahoo.com.ar>
wrote:
En Wed, 26 Mar 2008 00:39:05 -0300, skunkwerk <skunkw...@gmail.com*
escribió:
* *i'm trying to call subprocess.popen on the 'rename' function in
linux. *When I run the command from the shell, like so:
rename -vn 's/\.htm$/\.html/' *.htm
it works fine... however when I try to do it in python like so:
p = subprocess.Popen(["rename","-vn","'s/\.htm$/
\.html/'","*.htm"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print p.communicate()[0]
nothing gets printed out (even for p.communicate()[1])

I'd try with:

p = subprocess.Popen(["rename", "-vn", r"'s/\.htm$/\.html/'", "*.htm"],
* * * *stdout=subprocess.PIPE, stderr=subprocess.PIPE,
* * * *shell=True)

(note that I added shell=True and I'm using a raw string to specify the *
reg.expr.)

--
Gabriel Genellina
Thanks Gabriel,
I tried the new command and one with the raw string and single
quotes, but it is still giving me the same results (no output). any
other suggestions?

cheers
Mar 26 '08 #4
En Wed, 26 Mar 2008 02:15:28 -0300, skunkwerk <sk*******@gmail.com>
escribió:
On Mar 25, 9:25*pm, "Gabriel Genellina" <gagsl-...@yahoo.com.ar>
wrote:
>En Wed, 26 Mar 2008 00:39:05 -0300, skunkwerk <skunkw...@gmail.com*
escribió:
>* *i'm trying to call subprocess.popen on the 'rename' function in
linux. *When I run the command from the shell, like so:
>rename -vn 's/\.htm$/\.html/' *.htm
>it works fine... however when I try to do it in python like so:
p = subprocess.Popen(["rename","-vn","'s/\.htm$/
\.html/'","*.htm"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>print p.communicate()[0]
>nothing gets printed out (even for p.communicate()[1])

I'd try with:

p = subprocess.Popen(["rename", "-vn", r"'s/\.htm$/\.html/'", "*.htm"],
* * * *stdout=subprocess.PIPE, stderr=subprocess.PIPE,
* * * *shell=True)

(note that I added shell=True and I'm using a raw string to specify the
reg.expr.)

Thanks Gabriel,
I tried the new command and one with the raw string and single
quotes, but it is still giving me the same results (no output). any
other suggestions?
My next try would be without the single quotes...

--
Gabriel Genellina

Mar 26 '08 #5
On Mar 25, 11:04*pm, "Gabriel Genellina" <gagsl-...@yahoo.com.ar>
wrote:
En Wed, 26 Mar 2008 02:15:28 -0300, skunkwerk <skunkw...@gmail.com*
escribió:
On Mar 25, 9:25*pm, "Gabriel Genellina" <gagsl-...@yahoo.com.ar>
wrote:
En Wed, 26 Mar 2008 00:39:05 -0300, skunkwerk <skunkw...@gmail.com*
escribió:
* *i'm trying to call subprocess.popen on the 'rename' function in
linux. *When I run the command from the shell, like so:
rename -vn 's/\.htm$/\.html/' *.htm
it works fine... however when I try to do it in python like so:
p = subprocess.Popen(["rename","-vn","'s/\.htm$/
\.html/'","*.htm"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print p.communicate()[0]
nothing gets printed out (even for p.communicate()[1])
I'd try with:
p = subprocess.Popen(["rename", "-vn", r"'s/\.htm$/\.html/'", "*.htm"],
* * * *stdout=subprocess.PIPE, stderr=subprocess.PIPE,
* * * *shell=True)
(note that I added shell=True and I'm using a raw string to specify the *
reg.expr.)
Thanks Gabriel,
* *I tried the new command and one with the raw string and single
quotes, but it is still giving me the same results (no output). *any
other suggestions?

My next try would be without the single quotes...

--
Gabriel Genellina
thanks for the input guys,
I've tried the suggestions but can't get it to work. I have a file
named test.htm in my directory, and when I run the following command:

rename -vn 's/(.*)\.htm$/model.html/' *.htm

from the shell in that directory I get the following output:
test.htm renamed as model.html

now my python script is called test.py, is located in the same
directory, and is called from the shell with 'python test.py'
the contents of test.py:
import subprocess

p = subprocess.Popen(['rename','-vn','s/(.*)\.htm$/
model.html/','*.htm'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print p.communicate()[0]

i change to print p.communicate()[1] in case the output is blank the
first time

this is the output:
*.htm renamed as model.html

when I add shell=True to the subprocess command, I get the following
output:
Usage: rename [-v] [-n] [-f] perlexpr [filenames]

am i doing something wrong?
Mar 26 '08 #6
On Mar 26, 6:44*am, skunkwerk <skunkw...@gmail.comwrote:
On Mar 25, 11:04*pm, "Gabriel Genellina" <gagsl-...@yahoo.com.ar>
wrote:
En Wed, 26 Mar 2008 02:15:28 -0300, skunkwerk <skunkw...@gmail.com*
escribió:
On Mar 25, 9:25*pm, "Gabriel Genellina" <gagsl-...@yahoo.com.ar>
wrote:
>En Wed, 26 Mar 2008 00:39:05 -0300, skunkwerk <skunkw...@gmail.com*
>escribió:
>* *i'm trying to call subprocess.popen on the 'rename' function in
>linux. *When I run the command from the shell, like so:
>rename -vn 's/\.htm$/\.html/' *.htm
>it works fine... however when I try to do it in python like so:
>p = subprocess.Popen(["rename","-vn","'s/\.htm$/
>\.html/'","*.htm"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>print p.communicate()[0]
>nothing gets printed out (even for p.communicate()[1])
>I'd try with:
>p = subprocess.Popen(["rename", "-vn", r"'s/\.htm$/\.html/'", "*.htm"],
>* * * *stdout=subprocess.PIPE, stderr=subprocess.PIPE,
>* * * *shell=True)
>(note that I added shell=True and I'm using a raw string to specifythe *
>reg.expr.)
Thanks Gabriel,
* *I tried the new command and one with the raw string and single
quotes, but it is still giving me the same results (no output). *any
other suggestions?
My next try would be without the single quotes...
--
Gabriel Genellina

thanks for the input guys,
* I've tried the suggestions but can't get it to work. *I have a file
named test.htm in my directory, and when I run the following command:

rename -vn 's/(.*)\.htm$/model.html/' *.htm

from the shell in that directory I get the following output:
test.htm renamed as model.html

now my python script is called test.py, is located in the same
directory, and is called from the shell with 'python test.py'
the contents of test.py:
import subprocess

p = subprocess.Popen(['rename','-vn','s/(.*)\.htm$/
model.html/','*.htm'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print p.communicate()[0]

i change to print p.communicate()[1] in case the output is blank the
first time

this is the output:
*.htm renamed as model.html

when I add shell=True to the subprocess command, I get the following
output:
Usage: rename [-v] [-n] [-f] perlexpr [filenames]

am i doing something wrong?
in addition, when I use Popen without any quotes, or without quotes
for the regular expression, I get an exception.

I'm running ubuntu linux 7.10 with python 2.5.1

thanks
Mar 26 '08 #7
On Mar 26, 10:33*pm, skunkwerk <skunkw...@gmail.comwrote:
On Mar 26, 8:05*am, Jeffrey Froman <jeff...@fro.manwrote:
skunkwerkwrote:
p = subprocess.Popen(['rename','-vn','s/(.*)\.htm$/
model.html/','*.htm'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print p.communicate()[0]
i change to print p.communicate()[1] in case the output is blank the
first time
this is the output:
*.htm renamed as model.html
Without shell=True, your glob characters will not be expanded. Hence, the
command looks for a file actually named "*.htm"
when I add shell=True to the subprocess command, I get the following
output:
Usage: rename [-v] [-n] [-f] perlexpr [filenames]
Here the use of the shell may be confounding the arguments passed. Your
command will probably work better if you avoid using shell=True. However,
you will need to perform your own globbing:
# Untested (no perl-rename here):
command = ['rename','-vn', 's/(.*)\.htm$/model.html/']
files = glob.glob('*.htm')
command.extend(files)
p = subprocess.Popen(
* * command,
* * stdout=subprocess.PIPE,
* * stderr=subprocess.PIPE,
* * )
Jeffrey

thanks Jeffrey, that worked like a charm!
I'm trying to detect when the subprocess has terminated using the
wait() function - but when there is an error with the call to rename
(ie the file doesn't exist) rename (when run from the command line
just terminates and displays the error). In the code above, though,
my call to p.wait() just hangs when rename should throw an error...
I've tried adding shell=True but that stops the rename from working.
any ideas?

thanks
Jun 27 '08 #8

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

5 posts views Thread by Cameron Laird | last post: by
12 posts views Thread by Eric_Dexter | last post: by
9 posts views Thread by Phoe6 | last post: by
3 posts views Thread by mclaugb | last post: by
3 posts views Thread by BartlebyScrivener | last post: by
1 post views Thread by Steven Bethard | last post: by
25 posts views Thread by Jeremy Banks | last post: by
1 post views Thread by Mark Shewfelt | last post: by
reply views Thread by leo001 | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.