[Python3 argparse] mutually exclusive group, sommige met arg

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 20:27

Matis

Rubber Rocket

Topicstarter
Beste Devvers,

Op dit moment ben ik een oud bash script aan het omschrijven in Python3. Het script wordt intern gebruikt om onze Video-server testmateriaal af te laten spelen.

Dit bash script ondersteunt de volgende argumenten :
-play file
-rec file 
-list       
-stop       
-remove     
-who        

Deze argumenten zijn mutually exclusive. Wat inhoudt dat je maar één van bovenstaande opties kunt meegeven aan het script.
De eerste twee vereisen ook nog een file argument, de overige argumenten niet.

Ik probeer dit middels Pythons argparse te bereiken, maar tot op heden geen soelaas.

Relevante Python 3 code:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
def parse_arguments():
    parser = argparse.ArgumentParser()
    action_group = parser.add_mutually_exclusive_group(required=True)
    action_group.add_argument('-play', dest='file')
    action_group.add_argument('-rec', dest='file')
    action_group.add_argument('-list', dest='')
    action_group.add_argument('-stop', dest='')
    action_group.add_argument('-remove', dest='')
    action_group.add_argument('-who', dest='')

    args = parser.parse_args()
    return args


Dit geeft het volgende resultaat:
usage: video.py [-h]
                (-play FILE | -rec FILE | -list  | -stop  | -remove  | -who )
video.py: error: one of the arguments -play -rec -list -stop -remove -who is required

Dat lijkt goed, maar schijn bedriegt, want stiekem verwacht hij nu ook bij list, stop, remove en who een argument.

Wanneer ik de dest niet opgeef voor de 4 argumenten krijg ik de volgende lijst:
usage: video.py [-h]
                (-play FILE | -rec FILE | -list LIST | -stop STOP | -remove REMOVE | -who WHO)
video.py: error: one of the arguments -play -rec -list -stop -remove -who is required


Het lukt me niet om de argparse wijs te maken dat er bij de laatste 4 argumenten géén

Ik verwacht niet dat het veel uitmaakt, maar het script draait op een Ubuntu 16.04 machine met Python 3.5.2.

Wie kan me helpen _O_

Matis

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Matis schreef op vrijdag 27 oktober 2017 @ 11:11:

Dit geeft het volgende resultaat:
usage: video.py [-h]
                (-play FILE | -rec FILE | -list  | -stop  | -remove  | -who )
video.py: error: one of the arguments -play -rec -list -stop -remove -who is required
Hier zit 'm ook meteen de crux in. Het lijkt alsof de parameters niet verwacht zijn, maar dat is niet zo. Je ziet bijvoorbeeld bij '-stop' twee spaties erachter staan, waardoor de parameter alsnog verwacht wordt. De naam is alleen leeg gemaakt.

Wat je kunt doen is:

Python:
1
2
3
4
5
6
7
8
9
10
11
12
parser = argparse.ArgumentParser()
action_group = parser.add_mutually_exclusive_group(required=True)
action_group.add_argument('-play', dest='play')
action_group.add_argument('-rec', dest='record')
action_group.add_argument('-list', action='store_const', const=True, default=False)
action_group.add_argument('-stop', action='store_const', const=True, default=False)
action_group.add_argument('-remove', action='store_const', const=True, default=False)
action_group.add_argument('-who', action='store_const', const=True, default=False)

print(parser.parse_args(args=['-play', 'test.mp3']))
print(parser.parse_args(args=['-list']))
print(parser.parse_args(args=['-h']))


Dan kun je ook onderscheid maken tussen play en rec.

Acties:
  • 0 Henk 'm!

  • Twieka
  • Registratie: Oktober 2010
  • Laatst online: 01-03 17:06
dest='' weg halen.

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 20:27

Matis

Rubber Rocket

Topicstarter
Dat werkt helaas niet. Zie mijn tweede voorbeeld in de TS.

@Feanathiel dank. Ik dacht dat die store functies altijd in je project gedefinieerd moeten worden. Ik ga het proberen. Thnx!

If money talks then I'm a mime
If time is money then I'm out of time