Passing parameters at the command line (New Python User)

C

cjt22

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 == "-no":
Initialise.init(0)
Process.processCon(file2,1)
Output.print()

if args == "-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
 
D

Diez B. Roggisch

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
 
B

Ben Finney

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-optparse> from the
standard library.
 
M

Marc 'BlackJack' Rintsch

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

if args == "-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
 
S

Steven Bethard

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 == "-no":
Initialise.init(0)
Process.processCon(file2,1)
Output.print()

if args == "-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
 

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

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top