Multi-line strings with formatting

G

gburdell1

When constructing a particularly long and complicated command to be
sent to the shell, I usually do something like this, to make the
command as easy as possible to follow:

commands.getoutput(
'mycommand -S %d -T %d ' % (s_switch, t_switch) +
'-f1 %s -f2 %s ' % (filename1, filename2) +
'> %s' % (log_filename)
)

Can anyone suggest a better way to construct the command, especially
without the "+" sign at the end of each line (except the last) ? If I
take out the "+", then I need to move all the variables to the end, as
so:

commands.getoutput(
'mycommand -S %d -T %d '
'-f1 %s -f2 %s '
'> %s'
% (s_switch, t_switch, filename1, filename2, log_filename)
)

or:

commands.getoutput(
'''mycommand -S %d -T %d \
-f1 %s -f2 %s \
% (s_switch, t_switch, filename1, filename2, log_filename)
)

but having the variables line-by-line as in the first example is so
much easier to edit, is it not?
 
C

Carsten Haese

When constructing a particularly long and complicated command to be
sent to the shell, I usually do something like this, to make the
command as easy as possible to follow:

commands.getoutput(
'mycommand -S %d -T %d ' % (s_switch, t_switch) +
'-f1 %s -f2 %s ' % (filename1, filename2) +
'> %s' % (log_filename)
)

Can anyone suggest a better way to construct the command, especially
without the "+" sign at the end of each line (except the last) ? If I
take out the "+", then I need to move all the variables to the end, as
so:

commands.getoutput(
'mycommand -S %d -T %d '
'-f1 %s -f2 %s '
'> %s'
% (s_switch, t_switch, filename1, filename2, log_filename)
)

or:

commands.getoutput(
'''mycommand -S %d -T %d \
-f1 %s -f2 %s \
% (s_switch, t_switch, filename1, filename2, log_filename)
)

You get the best of both worlds, i.e. one big multiline string with
in-line parameters, by using a mapping:

commands.getoutput(
'''mycommand -S %(s_switch)d -T %(t_switch)d \
-f1 %(filename1)s -f2 %(filename2)s \
> %(log_filename)s'''
% locals() )

Of course I'm assuming that s_switch etc. are local variables. If
they're not, well, they ought to be.

-Carsten
 
S

Steve Holden

Carsten said:
You get the best of both worlds, i.e. one big multiline string with
in-line parameters, by using a mapping:

commands.getoutput(
'''mycommand -S %(s_switch)d -T %(t_switch)d \
-f1 %(filename1)s -f2 %(filename2)s \
% locals() )

Of course I'm assuming that s_switch etc. are local variables. If
they're not, well, they ought to be.

-Carsten
If that doesn't suit then build a list:

l = [
'mycommand -S %d -T %d ' % (s_switch, t_switch) ,
'-f1 %s -f2 %s ' % (filename1, filename2) ,
'> %s' % (log_filename)
]

and then return commands.getoutput("".join(l)).

regards
Steve
 
P

Paul McGuire

You get the best of both worlds, i.e. one big multiline string with
in-line parameters, by using a mapping:
commands.getoutput(
'''mycommand -S %(s_switch)d -T %(t_switch)d \
-f1 %(filename1)s -f2 %(filename2)s \
% locals() )
Of course I'm assuming that s_switch etc. are local variables. If
they're not, well, they ought to be.

If that doesn't suit then build a list:

l = [
'mycommand -S %d -T %d ' % (s_switch, t_switch) ,
'-f1 %s -f2 %s ' % (filename1, filename2) ,
'> %s' % (log_filename)
]

and then return commands.getoutput("".join(l)).

regards
Steve

--
Steve Holden +44 150 684 7255 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://del.icio.us/steve.holden
Recent Ramblings http://holdenweb.blogspot.com- Hide quoted text -

- Show quoted text -

This list might be even simpler to follow:

l = [
'mycommand',
'-S', s_switch,
'-T', t_switch,
'-f1', filename1,
'-f2', filename2,
'>', log_filename
]
cmd = " ".join(l)

(and I'm glad I'm not the only one who uses 'l' for a scratch list
variable...)

-- Paul
 
S

Steven D'Aprano

(and I'm glad I'm not the only one who uses 'l' for a scratch list
variable...)

Yes, and come the revolution, every last one of you will be down the salt
mines.

I don't mind using capital L as a variable, but l looks too much like I
and 1 in most typefaces. Capital O is another nasty one. I also try to
avoid using a as a variable name, because a is a definite article
in English (like "the") and that makes it difficult to write grammatical
sentences about what you're doing.
 
S

Steven Bethard

> When constructing a particularly long and complicated command to be
> sent to the shell, I usually do something like this, to make the
> command as easy as possible to follow:
> commands.getoutput(
> 'mycommand -S %d -T %d ' % (s_switch, t_switch) +
> '-f1 %s -f2 %s ' % (filename1, filename2) +
> '> %s' % (log_filename)
> )
> Can anyone suggest a better way to construct the command, especially
> without the "+" sign at the end of each line (except the last) ?

Paul said:
This list might be even simpler to follow:

l = [
'mycommand',
'-S', s_switch,
'-T', t_switch,
'-f1', filename1,
'-f2', filename2,
'>', log_filename
]
cmd = " ".join(l)

And if you use the subprocess module, you won't even need (or want) the
final join.

STeVe
 
S

Steve Holden

Steven said:
Yes, and come the revolution, every last one of you will be down the salt
mines.
Better that than up against the wall, I suppose.

regards
Steve
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,576
Members
45,054
Latest member
LucyCarper

Latest Threads

Top