You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
argparse has problem parsing option files containing empty rows #54732
When using the argument file option, i.e @file_with_arguments the following problems arise:
argparse crashes when the file contains an empty line (even if it is the last line) - arg_string[0] is done when arg_string is empty.
This is caused by the use of splitlines() instead of strip().split() in the function _read_args_from_files(self, arg_strings)
options separated by spaces in one row are passed as a single long option, meaning each option has to be on its own line.
This is caused by the new function
The current behaviour takes empty lines and interprets them as empty strings.
The attached demonstration script shows the error occurring. The first case is a simple example to illustrate what happens in the general case. The second case shows empty lines being interpreted as empty strings and assigned to arguments.
The third case, despite being very similar to the first, results in argparse exiting with an error message. Internally, what is happening is, after taking the 'foo' and 'baz' arguments and assigning them 'bar' and 'quux' respectively, it reads in an argument "", which it does not recognize. And produces the following error message:
The error message, in it's current form, is kind of opaque.
For the third case, if we move the blank line to between 'bar' and '-baz', the same error results, as again it tried to interpret the blank line as an argument. If we move the blank line to the start of the file, same thing again.
If we move the blank line between '-foo' and 'bar', instead the error reads: "argparse_example.py: error: unrecognized arguments: bar" - which is at least somewhat comprehensible.
The question is, how should blank lines be handled?
Should they be accepted as possible values for arguments?
If they fall into spaces where arguments (versus values for arguments) are expected, should we skip them?
If the current handling is fine, I would propose updating the documentation to add the following after the paragraph that begins "Arguments read from a file ...":
"By default, blank lines are interpreted as empty strings. An empty string is not an acceptable argument; but it is an acceptable value for an argument."
And changing the way that the error from argparse is displayed so that it is more obvious what "argparse_example.py: error: unrecognized arguments:" means.
mathfoo commented on Apr 15, 2014
mathfoomannequin
Mannequin
More actions
I've attached a patch making the changes I suggested, assuming that the current behaviour is desirable. It documents the behaviour of argparse on files with blank lines and changes the way the error message that argparse generates when encountering unrecognized arguments is generated.
When a blank line is included at the end of a file, the resulting error message is now: "argparse_example.py: error: unrecognized arguments: ''". This also makes it obvious when the problem is white space, e.g. if an argument has trailing spaces, this also makes that obvious.
This is an expected behavior. How would you pass an empty string as argument?
We can make this more explicit in the documentation. This is very easy issue.
Other problem -- reporting empty (or containing only whitespaces, or containing control codes) strings as invalid arguments. Please open a separate issue for this.
You can just add that empty lines are interpreted as empty strings. This is redundant, but a little redundancy would not harm if this is not obvious for some users, and while it is little. I would add more, for example the convert_arg_line_to_args example needs a note that that simple example makes impossible to specify strings containing spaces (and an empty line is still interpreted as an empty string), or that the only way to pass an argument that starts with fromfile_prefix_chars is to read it from a file.
If you revert #136795, I'll provide my variant. Or I can include the reversion in my PR.
Activity
MichalPomorski commentedon Nov 24, 2010
When using the argument file option, i.e @file_with_arguments the following problems arise:
argparse crashes when the file contains an empty line (even if it is the last line) - arg_string[0] is done when arg_string is empty.
This is caused by the use of splitlines() instead of strip().split() in the function _read_args_from_files(self, arg_strings)
options separated by spaces in one row are passed as a single long option, meaning each option has to be on its own line.
This is caused by the new function
Both problems are caused by a modification in
The version from argparse 1.0.1 worked well and was correct, it should be sufficient to reverse the changes done from 1.0.1 to 1.1.
Here is the old implementation:
bethard commentedon Feb 10, 2011
Crashing on an empty line is definitely a bug.
Each line being a single option is documented behavior:
http://docs.python.org/dev/library/argparse.html#fromfile-prefix-chars
mathfoo commentedon Apr 14, 2014
The current behaviour takes empty lines and interprets them as empty strings.
The attached demonstration script shows the error occurring. The first case is a simple example to illustrate what happens in the general case. The second case shows empty lines being interpreted as empty strings and assigned to arguments.
The third case, despite being very similar to the first, results in argparse exiting with an error message. Internally, what is happening is, after taking the 'foo' and 'baz' arguments and assigning them 'bar' and 'quux' respectively, it reads in an argument "", which it does not recognize. And produces the following error message:
"argparse_example.py: error: unrecognized arguments:"
The error message, in it's current form, is kind of opaque.
For the third case, if we move the blank line to between 'bar' and '-baz', the same error results, as again it tried to interpret the blank line as an argument. If we move the blank line to the start of the file, same thing again.
If we move the blank line between '-foo' and 'bar', instead the error reads: "argparse_example.py: error: unrecognized arguments: bar" - which is at least somewhat comprehensible.
The question is, how should blank lines be handled?
Should they be accepted as possible values for arguments?
If they fall into spaces where arguments (versus values for arguments) are expected, should we skip them?
If the current handling is fine, I would propose updating the documentation to add the following after the paragraph that begins "Arguments read from a file ...":
"By default, blank lines are interpreted as empty strings. An empty string is not an acceptable argument; but it is an acceptable value for an argument."
And changing the way that the error from argparse is displayed so that it is more obvious what "argparse_example.py: error: unrecognized arguments:" means.
mathfoo commentedon Apr 15, 2014
I've attached a patch making the changes I suggested, assuming that the current behaviour is desirable. It documents the behaviour of argparse on files with blank lines and changes the way the error message that argparse generates when encountering unrecognized arguments is generated.
When a blank line is included at the end of a file, the resulting error message is now: "argparse_example.py: error: unrecognized arguments: ''". This also makes it obvious when the problem is white space, e.g. if an argument has trailing spaces, this also makes that obvious.
serhiy-storchaka commentedon Jul 3, 2025
This is an expected behavior. How would you pass an empty string as argument?
We can make this more explicit in the documentation. This is very easy issue.
Other problem -- reporting empty (or containing only whitespaces, or containing control codes) strings as invalid arguments. Please open a separate issue for this.
17 remaining items
serhiy-storchaka commentedon Jul 21, 2025
You can just add that empty lines are interpreted as empty strings. This is redundant, but a little redundancy would not harm if this is not obvious for some users, and while it is little. I would add more, for example the
convert_arg_line_to_argsexample needs a note that that simple example makes impossible to specify strings containing spaces (and an empty line is still interpreted as an empty string), or that the only way to pass an argument that starts withfromfile_prefix_charsis to read it from a file.If you revert #136795, I'll provide my variant. Or I can include the reversion in my PR.
pythongh-54732: Make argparse error caused by empty rows in option fi…
pythongh-54732: Make argparse error caused by empty rows in option fi…
[3.14] pythongh-54732: Make argparse error caused by empty rows in op…
Merge branch 'main' into pythongh-54732-fromfile-empty-line-doc
Merge branch 'main' into pythongh-54732-fromfile-empty-line-doc
GH-54732: Tweak wording around empty lines in argument files (#150980)
[3.13] GH-54732: Tweak wording around empty lines in argument files (G…
[3.14] GH-54732: Tweak wording around empty lines in argument files (G…
[3.15] GH-54732: Tweak wording around empty lines in argument files (G…
pythonGH-54732: Tweak wording around empty lines in argument files (p…
pythonGH-54732: Tweak wording around empty lines in argument files (p…