Seite 1 von 1

argparse problem

Verfasst: Sonntag 29. Mai 2011, 10:59
von mit
Hallo,
wenn der Benutzer in den folgenden Beispiel kein Verzeichnis angibt wie koennte man do_awesome2 aufrufen, aber wenn er Verzeichnis angibt soll do_awesome(args.dir) aufgerufen werden?

Code: Alles auswählen

import argparse
parser = argparse.ArgumentParser(description='Test')
parser.add_argument('--dir', nargs='?', help='Ouput directory')
args = parser.parse_args()

do_awesome(args.dir) 
do_awesome2('temp/')
Vielen Dank im Vorraus.

Re: argparse problem

Verfasst: Sonntag 29. Mai 2011, 11:26
von lunar

Code: Alles auswählen

if args.dir:
    # …
else:
    # …
Das ist doch eigentlich Grundwissen …

Re: argparse problem

Verfasst: Mittwoch 1. Juni 2011, 12:53
von mit
Danke, aber habe ich mit dem folgende Code Probleme:

Code: Alles auswählen

import argparse
import unittest

def add(a,b): return a+b
def mult(a,b): return a*b

class TestCalculator(unittest.TestCase):

    def test_add(self):
        self.assertEqual( 4, add(1,3))
        self.assertEqual( 0, add(0,0))
        self.assertEqual(-3, add(-1,-2))
    def test_mult(self):
        self.assertEqual( 3, mult(1,3))
        self.assertEqual( 0, mult(0,3))

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--test', help='Test calculater')

    args = parser.parse_args()
    if args.test:
        unittest.main()
    else:
        print 'do something'
Ich bekomme folgende erros
1.)
$ python __init__.py --test
usage: __init__.py [-h] [--test TEST]
__init__.py: error: argument --test: expected one argument


2.)
$ python __init__.py --test TestCalculator
option --test not recognized
Usage: __init__.py [options] [test] [...]

Options:
-h, --help Show this message
-v, --verbose Verbose output
-q, --quiet Minimal output
-f, --failfast Stop on first failure
-c, --catch Catch control-C and display results
-b, --buffer Buffer stdout and stderr during test runs

Examples:
__init__.py - run default set of tests
__init__.py MyTestSuite - run suite 'MyTestSuite'
__init__.py MyTestCase.testSomething - run MyTestCase.testSomething
__init__.py MyTestCase - run all 'test*' test methods
in MyTestCase

Wie bekommt es zum laufen?

Re: argparse problem

Verfasst: Mittwoch 1. Juni 2011, 13:00
von lunar
Das kann so nicht funktionieren. Wenn "--test" kein Argument entgegen nehmen soll, musst Du mindestens "action='store_true'" bei ".add_argument()" angeben.

Außerdem versucht "unittest.main()" selbst, die Argumente zu parsen, was natürlich fehlschlägt, weil es die Argumente Deiner Anwendung nicht versteht. Entweder musst Du alle Argumente Deiner Anwendung vorher aus "sys.argv" entfernen, oder Du kannst nicht "unittest.main()" benutzen. In letzterem Falle musst Du die Test-Ausführung mithilfe der unittest-API selbst durchführen.

Re: argparse problem

Verfasst: Donnerstag 2. Juni 2011, 13:23
von mit
Danke, ich habe es mit sys.argv = [sys.argv[0]] geloest, aber bekomme folgende errors:

Code: Alles auswählen

$ python __init__.py --test
usage: __init__.py [-h] --value_1 [VALUE_1] --value_2 [VALUE_2] [--test]
__init__.py: error: argument --value_1 is requiredd
mit den folgenden Code

Code: Alles auswählen

import argparse
import unittest
import sys

def add(a,b): return a+b
def mult(a,b): return a*b

class TestCalculator(unittest.TestCase):

    def test_add(self):
        self.assertEqual( 4, add(1,3))
        self.assertEqual( 0, add(0,0))
        self.assertEqual(-3, add(-1,-2))

    def test_mult(self):
        self.assertEqual( 3, mult(1,3))
        self.assertEqual( 0, mult(0,3))

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--value_1', nargs='?', required=True)
    parser.add_argument('--value_2', nargs='?', required=True)
    parser.add_argument('--test', action='store_true', help='Test calculater')

    args = parser.parse_args()
    if args.test:
        sys.argv = [sys.argv[0]]
        unittest.main()
    else:
        print 'do something'
Wie kann ich test ausfuehren ohne value_1 und value_2 anzugeben muessen?

Re: argparse problem

Verfasst: Montag 6. Juni 2011, 15:04
von lunar
@mit: Du hast "--value_1" mit "required=True" erzeugt und wunderst Dich nun, dass dieses Argument auch wirklich "required" ist?!

Re: argparse problem

Verfasst: Montag 6. Juni 2011, 22:35
von mit
Ich wollte den User zwei Moeglichkeiten geben.
1.) den Code zu testen (--test)
2.) den Code ausfuehren zu koennen. Um dieses korrekt tun zu koennen muss der User --value_1 und --value_2 eingeben.

Wie ist es moeglich diese zwei moeglichkeiten zu implementieren?

Re: argparse problem

Verfasst: Dienstag 7. Juni 2011, 07:30
von lunar
Ohne Verrenkungen kannst Du das so gar nicht implementieren. Behelfsweise kannst Du Sub-commands nutzen.

Wesentlich sinnvoller aber wäre es, einfach ein separates Programm zum Testen zu schreiben. Ein normaler Nutzer ist an der Ausgabe der Unittests doch ohnehin nicht im Geringsten interessiert.

Noch eine Anmerkung zu obligatorischen Optionen: Optionale Argumente sollten – wie der Name schon sagt – optional sein. Für zwingend erforderliche Argumente nutzt man besser postionale Argumente (siehe auch die Doku zu required.