73

What's the preferred way of specifying program name and version info within argparse?

__version_info__ = ('2013','03','14')
__version__ = '-'.join(__version_info__)
...
parser.add_argument('-V', '--version', action='version', version="%(prog)s ("+__version__+")")

2 Answers 2

120

Yes, that's the accepted way. From http://docs.python.org/dev/library/argparse.html#action:

>>> parser.add_argument('--version', action='version', version='%(prog)s 2.0')

You should of course be embedding the version number in your package in a standard way: Standard way to embed version into python package?

If you're following that method, you have a __version__ variable:

from _version import __version__
parser.add_argument('--version', action='version',
                    version='%(prog)s {version}'.format(version=__version__))

For example, that's the method demonstrated at https://pypi.python.org/pypi/commando/0.3.2a:

parser.add_argument('-v', '--version', action='version', version='%(prog)s ' + __version__)
Sign up to request clarification or add additional context in comments.

5 Comments

how would this look like, in a standard way? i see you put your version example of "2.0" verbatim in the argparse code line ...
Fine, after the edit it is answering the question. Thanks a lot. Still I'm confused about %(var) and {var) though ...
@type %(var) is old % string formatting; {var} is new format string formatting.
It seems one cannot use a unified string formatting here parser.add_argument('-V', '--version', action='version', version="{prog}s ({version})".format(prog="%(prog)", version=__version__))
if here is a holy war then in new version you can even use f-string :D version=f'%(prog)s {version}'
10

Just wanted to post another approach. As of Python 3.8, you can get a package's version number as a string using importlib.metadata. So if your program is a package with a pyproject.toml file then you can get the version number that is defined in that file. The example below get's the version string of a command line tool named genja; where genja is the name of the Python package that is the command line program.

from importlib.metadata import version

parser.add_argument('-v', '--version', action='version', version=version('genja'))

3 Comments

I think it already works with 3.10.
importlib.metadata is available since 3.8, when the package was created in the standard library
Seems to only work with what was already installed, not a current pyproject.toml. So not as useful at development time. -e didn't help either.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.