summaryrefslogtreecommitdiffstats
path: root/Doc
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2024-10-01 19:51:40 (GMT)
committerGitHub <noreply@github.com>2024-10-01 19:51:40 (GMT)
commit04bfea2d261bced371cbd64931fe2a8f64984793 (patch)
tree8372ec5d0620ed6bcda6dbc2f5e6f5a5bca9cf8e /Doc
parentd150e4abcfc13770c2d239878ed337fb53e51de5 (diff)
downloadcpython-04bfea2d261bced371cbd64931fe2a8f64984793.zip
cpython-04bfea2d261bced371cbd64931fe2a8f64984793.tar.gz
cpython-04bfea2d261bced371cbd64931fe2a8f64984793.tar.bz2
gh-66436: Improved prog default value for argparse.ArgumentParser (GH-124799)
It can now have one of three forms: * basename(argv0) -- for simple scripts * python arv0 -- for directories, ZIP files, etc * python -m module -- for imported modules Co-authored-by: Alyssa Coghlan <ncoghlan@gmail.com>
Diffstat (limited to 'Doc')
-rw-r--r--Doc/library/argparse.rst41
-rw-r--r--Doc/whatsnew/3.14.rst7
2 files changed, 39 insertions, 9 deletions
diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst
index a4683bc..83d0a9e 100644
--- a/Doc/library/argparse.rst
+++ b/Doc/library/argparse.rst
@@ -30,7 +30,7 @@ Quick Links for ArgumentParser
========================= =========================================================================================================== ==================================================================================
Name Description Values
========================= =========================================================================================================== ==================================================================================
-prog_ The name of the program Defaults to ``os.path.basename(sys.argv[0])``
+prog_ The name of the program
usage_ The string describing the program usage
description_ A brief description of what the program does
epilog_ Additional description of the program after the argument help
@@ -214,8 +214,8 @@ ArgumentParser objects
as keyword arguments. Each parameter has its own more detailed description
below, but in short they are:
- * prog_ - The name of the program (default:
- ``os.path.basename(sys.argv[0])``)
+ * prog_ - The name of the program (default: generated from the ``__main__``
+ module attributes and ``sys.argv[0]``)
* usage_ - The string describing the program usage (default: generated from
arguments added to parser)
@@ -268,10 +268,18 @@ The following sections describe how each of these are used.
prog
^^^^
-By default, :class:`ArgumentParser` objects use the base name
-(see :func:`os.path.basename`) of ``sys.argv[0]`` to determine
-how to display the name of the program in help messages. This default is almost
-always desirable because it will make the help messages match the name that was
+By default, :class:`ArgumentParser` calculates the name of the program
+to display in help messages depending on the way the Python inerpreter was run:
+
+* The :func:`base name <os.path.basename>` of ``sys.argv[0]`` if a file was
+ passed as argument.
+* The Python interpreter name followed by ``sys.argv[0]`` if a directory or
+ a zipfile was passed as argument.
+* The Python interpreter name followed by ``-m`` followed by the
+ module or package name if the :option:`-m` option was used.
+
+This default is almost
+always desirable because it will make the help messages match the string that was
used to invoke the program on the command line. For example, consider a file
named ``myprogram.py`` with the following code::
@@ -281,7 +289,7 @@ named ``myprogram.py`` with the following code::
args = parser.parse_args()
The help for this program will display ``myprogram.py`` as the program name
-(regardless of where the program was invoked from):
+(regardless of where the program was invoked from) if it is run as a script:
.. code-block:: shell-session
@@ -299,6 +307,17 @@ The help for this program will display ``myprogram.py`` as the program name
-h, --help show this help message and exit
--foo FOO foo help
+If it is executed via the :option:`-m` option, the help will display a corresponding command line:
+
+.. code-block:: shell-session
+
+ $ /usr/bin/python3 -m subdir.myprogram --help
+ usage: python3 -m subdir.myprogram [-h] [--foo FOO]
+
+ options:
+ -h, --help show this help message and exit
+ --foo FOO foo help
+
To change this default behavior, another value can be supplied using the
``prog=`` argument to :class:`ArgumentParser`::
@@ -309,7 +328,8 @@ To change this default behavior, another value can be supplied using the
options:
-h, --help show this help message and exit
-Note that the program name, whether determined from ``sys.argv[0]`` or from the
+Note that the program name, whether determined from ``sys.argv[0]``,
+from the ``__main__`` module attributes or from the
``prog=`` argument, is available to help messages using the ``%(prog)s`` format
specifier.
@@ -324,6 +344,9 @@ specifier.
-h, --help show this help message and exit
--foo FOO foo of the myprogram program
+.. versionchanged:: 3.14
+ The default ``prog`` value now reflects how ``__main__`` was actually executed,
+ rather than always being ``os.path.basename(sys.argv[0])``.
usage
^^^^^
diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst
index ffc0012..67d8d38 100644
--- a/Doc/whatsnew/3.14.rst
+++ b/Doc/whatsnew/3.14.rst
@@ -202,6 +202,13 @@ New Modules
Improved Modules
================
+argparse
+--------
+
+* The default value of the :ref:`program name <prog>` for
+ :class:`argparse.ArgumentParser` now reflects the way the Python
+ interpreter was instructed to find the ``__main__`` module code.
+ (Contributed by Serhiy Storchaka and Alyssa Coghlan in :gh:`66436`.)
ast
---