1

I'm trying to learn pythons docopt module and have the following simple script:

""" Usage: rsnapshot-once [-c CFGFILE] (sync|hourly|daily|monthly) -c CFGFILE specify the configfile that rsnapshot should use """ import logging import sys from docopt import docopt args = docopt(__doc__, version='0.0.1-alpha') logging.basicConfig(stream=sys.stdout, level=logging.DEBUG, formatter=logging.BASIC_FORMAT) logging.debug("Parsed arguments:\n" + str(args)); if not args.get("-c"): args['CFGFILE'] = "/etc/rsnapshot.conf" 

When invoked from the command line with the -c option:

% ./rsnapshot-once.py -c someconfigfile sync DEBUG:root:Parsed arguments: {'-c': True, 'CFGFILE': 'someconfigfile', 'daily': False, 'hourly': False, 'monthly': False, 'sync': True} 

When only the command is passed:

% ./rsnapshot-once.py daily Usage: rsnapshot-once [-c CFGFILE] (sync|hourly|daily|monthly) 

It seems, that I am misunderstanding something. Could anyone give me a hint, what I'm doing wrong?

Thanks

1
  • It works fine for me. Could you be using an old version of docopt? Commented Sep 8, 2017 at 9:05

2 Answers 2

1

The example you have given works here. So maye it has something to do with the docopt version you are using. Regarding the notation you are almost on the right track, only some small details are missing.

Before the options, there should be a line that says "Options:". Docopt looks for this, and interprets the lines after. In the options part it is possible to set default values for options too.

Here is an example:

"""Usage: rsnapshot-once [-c CFGFILE] (sync|hourly|daily|monthly) Options: -c CFGFILE specify the configfile that rsnapshot should use [default: /etc/rsnapshot.conf] """ 

Then the user will also see what the default value is.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for those additions. The default option is a very good thing!
1

I got it working. Finally the problem was that I used tabs to format my usage docstring:

""" \t\t\tUsage: \t\t\trsnapshot-once [-c CFGFILE] (sync|hourly|daily|monthly) \t\t\tOptions: \t\t\t-c CFGFILE specify the configfile that rsnapshot should use """ 

When I change this to be:

""" Usage: rsnapshot-once [-c CFGFILE] (sync|hourly|daily|monthly) Options: -c CFGFILE specify the configfile that rsnapshot should use """ 

It works fine...

There is a similar issue I found after I figured out what the problem was: https://github.com/docopt/docopt/issues/368

EDIT: While from a functional point of view, the arguments are parsed correctly when no tabs are used. But in case the call is wrong, only the "Usage:"-Part of the docstring is printed. The "Options:"-Part is not. Can any of you confirm that?

For example, compare those variants:

1a. Valid call

1b. Invalid call(option part is not printed)

2a. Valid call (but not working)

2b. Invalid call (Text is printed as expected)

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.