MLG Herobrine
MLG Herobrine

Reputation: 88

Python - Allow Argparse to Accept an Option in an Argument

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

Answers (1)

hpaulj
hpaulj

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

Related Questions