2010-04-21 7 views
3

J'apprends actuellement comment utiliser le module Python optparse. J'essaie l'exemple de script suivant mais la variable args est vide. J'ai essayé ceci en utilisant Python 2.5 et 2.6 mais en vain.Python optparse ne fonctionne pas pour moi

import optparse 

def main(): 
    p = optparse.OptionParser() 
    p.add_option('--person', '-p', action='store', dest='person', default='Me') 
    options, args = p.parse_args() 

    print '\n[Debug]: Print options:', options 
    print '\n[Debug]: Print args:', args 
    print 

    if len(args) != 1: 
    p.print_help() 
    else: 
    print 'Hello %s' % options.person 

if __name__ == '__main__': 
    main() 

Sortie:

>C:\Scripts\example>hello.py -p Kelvin 

[Debug]: Print options: {'person': 'Kelvin'} 

[Debug]: Print args: [] 

Usage: hello.py [options] 

Options: -h, --help afficher ce message d'aide et quitter PERSONNE -p, --person = PERSONNE

Répondre

6

La variable args détient une arguments que n'ont pas été affectés à une option. Votre code fonctionne en effet correctement en affectant Kelvin à la variable d'option person.

Si vous essayiez en cours d'exécution hello.py -p Kelvin file1.txt, vous constaterez que person encore a été affecté la valeur "Kelvin", puis votre args contiendrait "file1.txt".

Voir aussi the documentation on optparse:

parse_args() retourne deux valeurs:

  • options, un objet contenant des valeurs pour toutes vos options-par exemple. si --file prend un seul argument de chaîne, puis options.file sera le nom de fichier fourni par l'utilisateur, ou None si l'utilisateur n'a pas fourni cette option
  • args, la liste des arguments de position restant après l'analyse des options
+0

Oh, je vois. Je lis des documents d'aide mais je suppose que je dois lire attentivement pour bien comprendre. Merci! Wow, la première fois ici et je reçois une réponse rapide. – Nebu10z

+0

Vous devez sélectionner une réponse, afin que les gens sachent que vous êtes digne de confiance et vous obtiendrez une réponse rapide la prochaine fois aussi! – Personman

0

Remarque: "options" est un dictionnaire avec les options que vous avez ajoutées. "Args" est une liste avec les arguments non analysés. Vous ne devriez pas regarder longuement "args". Voici une transcription pour illustrer:

moshez-mb:profile administrator$ cat foo 
import optparse 

def main(): 
    p = optparse.OptionParser() 
    p.add_option('--person', '-p', action='store', dest='person', default='Me') 
    options, args = p.parse_args() 
    print '\n[Debug]: Print options:', options 
    print '\n[Debug]: Print args:', args 
    print 
    if len(args) != 1: 
     p.print_help() 
    else: 
     print 'Hello %s' % options.person 

if __name__ == '__main__': 
    main() 
moshez-mb:profile administrator$ python foo 

[Debug]: Print options: {'person': 'Me'} 

[Debug]: Print args: [] 

Usage: foo [options] 

Options: 
    -h, --help   show this help message and exit 
    -p PERSON, --person=PERSON 
moshez-mb:profile administrator$ python foo -p Moshe 

[Debug]: Print options: {'person': 'Moshe'} 

[Debug]: Print args: [] 

Usage: foo [options] 

Options: 
    -h, --help   show this help message and exit 
    -p PERSON, --person=PERSON 
moshez-mb:profile administrator$ python foo -p Moshe argument 

[Debug]: Print options: {'person': 'Moshe'} 

[Debug]: Print args: ['argument'] 

Hello Moshe 
moshez-mb:profile administrator$ 
+0

Merci beaucoup. – Nebu10z

0

Selon optparse aide:

« Le succès retourne une paire (valeurs, args) où « valeurs » est une instance de valeurs (avec toutes vos valeurs d'option) et 'args' est la liste des arguments restants sur après les options d'analyse. "

Essayez hello.py -p Kelving abcd - 'Kelvin' sera analysé par optparse, 'ABCD' atterrira dans args variable retournée par parse_args

+0

Je l'ai essayé et vous avez raison. – Nebu10z

0
import ast 

(options, args) = parser.parse_args() 
noargs = ast.literal_eval(options.__str__()).keys() 
if len(noargs) != 1: 
    parser.error("ERROR: INCORRECT NUMBER OF ARGUMENTS") 
    sys.exit(1) 
+0

Je ne suis pas sûr que le module ast ait quelque chose à voir avec la raison pour laquelle la variable args est vide. Le nombre d'arguments n'est pas correct, ils sont simplement attribués différemment. – Mike

+0

pourriez-vous s'il vous plaît laissez-moi savoir ce qui ne va pas avec le code.btw c'est un travail autour ... je ne pouvais pas faire len (args) pour le faire fonctionner ....Je ne sais pas si je manque quelque chose. – Rama

+0

Il ne répond pas à la question, l'affiche demandait pourquoi 'args' était vide. La réponse était que les args ** devraient ** être vides, car c'est ainsi que fonctionne le 'optparser'. Votre code va ajouter la clé ''person'' et l'afficher, mais ce n'est pas ce qui est censé se passer ici. – Mike

Questions connexes