import configargparse
parser = configargparse.ArgParser()
parser.add_argument("--config", is_config_file_arg=True, default="config.cfg")
parser.add_argument('--config_file_option', nargs="*", default=None) # also happens with action="append" and any of its derivatives
parser.add_argument("remainder_option", nargs=argparse.REMAINDER, default=None)
args = ["test"]
options = parser.parse_args(args)
With config.cfg:
config_file_option=Option from config file
remainder_option should be ["test"], but it swallows the config file and becomes ["test", "--config_file_option=Option from config file"], which results in all config file options not being set.
It looks like if there is any other argument with nargs or action="append", then it will put all config options after the remainder option instead of before.
Changing it to args = config_args + args fixes this, but will probably break #144.
Upstream removed the documentation for argparse.REMAINDER because of the issues it causes, so it is unlikely this issue will be fixed.
https://github.com/python/cpython/pull/18661
Example:
With
config.cfg
:remainder_option
should be["test"]
, but it swallows the config file and becomes["test", "--config_file_option=Option from config file"]
, which results in all config file options not being set.I believe it is due to these lines: https://github.com/bw2/ConfigArgParse/blob/ee77f44d03415f2afe73c82096bae2293db29a3b/configargparse.py#L948-L955
It looks like if there is any other argument with
nargs
oraction="append"
, then it will put all config options after the remainder option instead of before.Changing it to
args = config_args + args
fixes this, but will probably break #144.