Reputation: 88
I've been trying to pass a command to argparse, however passing something like pacman -R
always ignores -R
. I'm using .parse_known_args()
to try and solve this, but it still doesn't work. I'm also using nargs='*' to have an unknown amount of arguments
Here's an idea of my desired output:
>>> parser.parse_args() # Input: cmdname pacman -R sudo
['pacman', '-R', 'sudo']
Current output:
>>> parser.parse_known_args() # Input: cmdname pacman -R sudo
['pacman']
How would I pass options (e.g. -R -S) as an argument? It doesn't matter if you use .parse_args() or .parse_known_args()
Edit: Sample code:
import argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument('arguments', nargs='*', help='Arguments to run')
args, extra = parser.parse_known_args()
commands = ''.join(args.arguments)
print(args.arguments, extra)
os.system(commands)
if __name__ == '__main__': main()
Upvotes: 0
Views: 77
Reputation: 231355
In [1]: import argparse
In [2]: parser = argparse.ArgumentParser()
...: parser.add_argument('arguments', nargs='*', help='Arguments to run')
argparse
interprets '-R' as a flag, so arguments
only gets the strings up to that point. The rest goes into extras
. That's deeply ingrained behavior in argparse
:
In [3]: parser.parse_known_args('pacman -R sudo'.split())
Out[3]: (Namespace(arguments=['pacman']), ['-R', 'sudo'])
You can use a '--' to force the handling of all following strings as arguments
In [4]: parser.parse_known_args('-- pacman -R sudo'.split())
Out[4]: (Namespace(arguments=['pacman', '-R', 'sudo']), [])
In [5]: parser.parse_known_args('pacman -- -R sudo'.split())
Out[5]: (Namespace(arguments=['pacman', '-R', 'sudo']), [])
Upvotes: 1