I want to create a mini shell, so after i run my file,
python3 ./main.py
With whatever arguments I add, I then just constantly take input like a normal shell,
>> command
output
>> -s
output
>>
So I am just doing simple while True: command = input()
, but these commands may take flags as well so stuff like
>> command -s -p -h
However I can’t really parse these the same way as when I run the the first file. Is there a way to parse the command -s -p -h
part again into argparser so I get the nice namespace?
I basically want my program to argparse normally when I run the main.py in the first place then be able to parse strings I create in the script, x = input()
again in with the same format for running my main.py.
Advertisement
Answer
.parse_args()
can take an args
argument with a list of strings to parse, for example:
import argparse
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument('-s', action='store_true')
parser.add_argument('-p', action='store_false')
parser.add_argument('-h', action='store_true')
command = 'command -s -p -h'
command_name, *command_args = command.split()
command_args_parsed = parser.parse_args(args=command_args)
print(command_args_parsed) # -> Namespace(h=True, p=False, s=True)
(The splitting here is just for example. You might be using something more thorough like shlex.split()
.)
This is covered in the documentation here: Parsing arguments