argparse problem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

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.
lunar

Code: Alles auswählen

if args.dir:
    # …
else:
    # …
Das ist doch eigentlich Grundwissen …
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

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?
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.
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

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?
lunar

@mit: Du hast "--value_1" mit "required=True" erzeugt und wunderst Dich nun, dass dieses Argument auch wirklich "required" ist?!
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

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?
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.
Antworten