Passing parameters at the command line (New Python User)

Discussion in 'Python' started by cjt22@bath.ac.uk, Sep 24, 2007.

  1. Guest

    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
     
    , Sep 24, 2007
    #1
    1. Advertising

  2. 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
     
    Diez B. Roggisch, Sep 24, 2007
    #2
    1. Advertising

  3. Ben Finney Guest

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

    --
    \ "Holy knit one purl two, Batman!" -- Robin |
    `\ |
    _o__) |
    Ben Finney
     
    Ben Finney, Sep 24, 2007
    #3
  4. On Mon, 24 Sep 2007 01:04:58 -0700, cjt22 wrote:

    > 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
     
    Marc 'BlackJack' Rintsch, Sep 24, 2007
    #4
  5. 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 == "-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
     
    Steven Bethard, Sep 24, 2007
    #5
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jonck van der Kogel
    Replies:
    2
    Views:
    996
    Jonck van der Kogel
    May 27, 2004
  2. Kenneth P. Turvey
    Replies:
    1
    Views:
    389
    Paul Hamaker
    Feb 25, 2006
  3. Replies:
    4
    Views:
    1,729
    Terry Hancock
    Apr 23, 2005
  4. hmikki
    Replies:
    1
    Views:
    148
    Nathan Sokalski
    Oct 19, 2007
  5. Jeff Leeman
    Replies:
    8
    Views:
    145
    Sebastian Hungerecker
    Apr 17, 2009
Loading...

Share This Page