471,357 Members | 1,086 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

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

Passing parameters at the command line (New Python User)

Hi there. I just wondered whether anyone could recommend the correct
way I should be passing command line parameters into my program. I am
currently using the following code:

def main(argv = None):
file1= "directory1"
file2 = "directory2"
if argv is None:
args = sys.argv[1:]

if len(args) == 0:
Initialise.init(0)
Process.processCon(file1, 0)
Output.print()

for i in range(len(args)):
if args[i] == "-no":
Initialise.init(0)
Process.processCon(file2,1)
Output.print()

if args[i] == "-not":
Initialise.init(1)
Process1.process(stepStore, firstSteps)
Output.print1()

if __name__ == "__main__":
main()
Have I used bad syntax here so that a user can either run the program
with commands:
main.py
main.py -no
main.py -not

If I also wanted an option file to be passed in at the command line
for 'main.py' and 'main.py -no' what would be the best way to go about
this? I have never used Python to pass in arguments at the command
line so any help would be much appreciated.

Cheers
Chris

Sep 24 '07 #1
4 5363
cj***@bath.ac.uk wrote:
Hi there. I just wondered whether anyone could recommend the correct
way I should be passing command line parameters into my program. I am
currently using the following code:
<snip/>

Use the module optparse.

Diez
Sep 24 '07 #2
cj***@bath.ac.uk writes:
I have never used Python to pass in arguments at the command line so
any help would be much appreciated.
Your 'main()' approach is good. I'd rather have the function require
an 'argv' parameter, and have the default set only in the 'if __name__
== "__main__":' block, since that fits my ideas better about the
defaults.

def main(argv):
parse_commandline(argv)
do_cool_stuff()

if __name__ == "__main__":
from sys import argv
main(argv)

I also tend to catch SystemExit in the function, so the exit code can
be returned instead of raised; but that's outside the scope of this
thread.

For anything more advanced than unconditionally grabbing arguments in
sequence from the command line, you should investigate the 'optparse'
module <URL:http://docs.python.org/lib/module-optparsefrom the
standard library.

--
\ "Holy knit one purl two, Batman!" -- Robin |
`\ |
_o__) |
Ben Finney
Sep 24 '07 #3
On Mon, 24 Sep 2007 01:04:58 -0700, cjt22 wrote:
for i in range(len(args)):
if args[i] == "-no":
Initialise.init(0)
Process.processCon(file2,1)
Output.print()

if args[i] == "-not":
Initialise.init(1)
Process1.process(stepStore, firstSteps)
Output.print1()
That ``for`` loop is an anti-pattern in Python. If you want to iterate
over the elements of `args` the just do it directly instead of using an
index:

for arg in args:
if arg == '-no':
# ...

If you need the element *and* an index:

for i, arg in enumarate(args):
# ...

Ciao,
Marc 'BlackJack' Rintsch
Sep 24 '07 #4
cj***@bath.ac.uk wrote:
Hi there. I just wondered whether anyone could recommend the correct
way I should be passing command line parameters into my program. I am
currently using the following code:

def main(argv = None):
file1= "directory1"
file2 = "directory2"
if argv is None:
args = sys.argv[1:]

if len(args) == 0:
Initialise.init(0)
Process.processCon(file1, 0)
Output.print()

for i in range(len(args)):
if args[i] == "-no":
Initialise.init(0)
Process.processCon(file2,1)
Output.print()

if args[i] == "-not":
Initialise.init(1)
Process1.process(stepStore, firstSteps)
Output.print1()

if __name__ == "__main__":
main()
Have I used bad syntax here so that a user can either run the program
with commands:
main.py
main.py -no
main.py -not

If I also wanted an option file to be passed in at the command line
for 'main.py' and 'main.py -no' what would be the best way to go about
this? I have never used Python to pass in arguments at the command
line so any help would be much appreciated.
A solution using argparse (http://argparse.python-hosting.com/):

import argparse

def main(no=False, nott=False):
file1 = "directory1"
file2 = "directory2"

if nott:
print 'Initialise.init(1)'
print 'Process1.process(stepStore, firstSteps)'
print 'Output.print1()'
else:
print 'Initialise.init(0)'
if no:
print 'Process.processCon(file2, 1)'
else:
print 'Process.processCon(file1, 0)'
print 'Output.print()'

if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('-no', action='store_true')
parser.add_argument('-not', action='store_true', dest='nott')
args = parser.parse_args()
main(no=args.no, nott=args.nott)

Note that I've used print statements since I don't have your Initialize,
Process, etc. objects. If I knew what "-no" and "-not" meant better, I
could give you a better suggestion, e.g. where you parse the 0 or 1
value for Initialize.init directly from the command line.

STeVe
Sep 24 '07 #5

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

2 posts views Thread by John Leslie | last post: by
1 post views Thread by Casey Bralla | last post: by
17 posts views Thread by Freeserve | last post: by
3 posts views Thread by AndyDunning | last post: by
4 posts views Thread by Mike Dinnis | last post: by
7 posts views Thread by Leo Breebaart | last post: by
2 posts views Thread by william.w.oneill | last post: by
reply views Thread by XIAOLAOHU | 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.