argparse_flags.ArgumentParser does not accept --flagfile if there are no flags
Minimum repro:
# foo.py
import absl.flags.argparse_flags
import argparse
# absl.flags.DEFINE_string("do_not_use_flagfile_hack", "", "") # A
parser = absl.flags.argparse_flags.ArgumentParser()
parser.add_argument("--foo")
parser.parse_args()
echo "--foo" > flags.txt
foo.py --flagfile=flags.txt
The error is:
foo.py: error: unrecognized arguments: --flagfile=flags.txt
The command would work if I uncomment line A.
It appears that ArgumentParser only accepts --flagfile if there are some DEFINE_'d strings. This is because of this line:
https://github.com/abseil/abseil-py/blob/main/absl/flags/argparse_flags.py#L156
if self._inherited_absl_flags: # <---
# Handle --flagfile.
# Explicitly specify force_gnu=True, since argparse behaves like
# gnu_getopt: flags can be specified after positional arguments.
args = self._inherited_absl_flags.read_flags_from_files(
args, force_gnu=True)
--flagfile is only accepted if bool(self._inherited_absl_flags), which is False if there are no DEFINE_d strings.
Thanks for the bug report and analysis! You are right, the code should check if self._inherited_absl_flags is not None instead. I'll try that.
Hi @yilei are there any updates?
@jacky8hyf Thanks for the ping! I picked this up again now.