Frage zu argv

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
Benutzeravatar
BernieMan
User
Beiträge: 4
Registriert: Sonntag 26. März 2006, 11:33
Kontaktdaten:

Hallo Gemeinde,
Als PHP-Umsteiger kämpfe ich mich langsam durch das Dickicht.
Nun habe Ich eine Frage an Euch.
Was ist an folgendem Code falsch:

Code: Alles auswählen

import sys

class Testclass:

    def __init__(self,arg):
        self.arg = arg
        arg = sys.argv[1]
        if arg in ['-h', '--hilfe']: self.__hilfe()
    
    def __hilfe(self):
        print "Testausgabe"
Das Script soll, wenn man den Parameter -h mitgibt, die Funktion __hilfe ausgeben.

Aber irgendwie steige Ich da noch nicht durch.
Für ein wenig Hilfe wäre Ich dankbar.

bis denne
BernieMan
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Du musst die Funktion __hilfe(self) erst definieren bevor du sie aufrufen kannst!

//edit: So müsste es also aussehen:

Code: Alles auswählen

import sys

class Testclass:
   def __hilfe(self):
        print "Testausgabe"

    def __init__(self,arg):
        self.arg = arg
        arg = sys.argv[1]
        if arg in ['-h', '--hilfe']: self.__hilfe()    
mfg

Thomas :-)
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

klappt doch, was du nur hast... :D (naja, vl. nicht so, wie sie dasteht, aber...)

aber ein bissel verdächtig finde ich, dass du die klasse gar nicht erst aufrufst.
schreib doch bitte sowas ähnliches wie

Code: Alles auswählen

meine_klasse = Testclass("irgendwas")
an das ende deiner datei, damit du die klasse auch wirklich benutzt :wink:
und außerdem würde ich es total verwirrend finden, käme einmal ein 'self.arg' und
ein 'arg' drin vor... denn wenn du ständig argumente angeben musst, sie aber nicht nutzt isses doch hirnrissig... (*sorry*)
hab sie mal nen bissel verändert, wenn du erlaubst :wink:

Code: Alles auswählen

class Testclass: 

    import sys
    def __init__(self): 
        self.arg = sys.argv[1] 
        if self.arg in ('-h', '--hilfe'): self.hilfe() 
    
    def hilfe(self): 
        print "Testausgabe" 

g = Testclass() # initialisiert die klasse/das objekt
[size=85]"Unsere Situation ist immer die eines schwarzen Mannes der in einem schwarzen Keller einen schwarzen Hut sucht, den es vielleicht gar nicht gibt." Sir Karl R. Popper[/size]
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

@python-master:
nix gegen dich oder so, aber das muss man nicht machen!
er findet sich die funktion selbst, da die klasse erst föllig abgearbeitet wurde, bevor sie zum laufen gebracht wurde...
wäre die funktion nicht in einer klasse, hättest du aber recht!
(*sorry*)
//edit: und auch DU hast kein lauffähiges script gepostet, da die aufrufende zeile fehlt...
Zuletzt geändert von Hannes-Spz am Sonntag 26. März 2006, 12:03, insgesamt 1-mal geändert.
[size=85]"Unsere Situation ist immer die eines schwarzen Mannes der in einem schwarzen Keller einen schwarzen Hut sucht, den es vielleicht gar nicht gibt." Sir Karl R. Popper[/size]
Benutzeravatar
BernieMan
User
Beiträge: 4
Registriert: Sonntag 26. März 2006, 11:33
Kontaktdaten:

Hallo PM47,

Klingt logisch -
Aber der Code funktioniert dennoch nicht und Ich wüsste gerne warum.

Grüsse BM
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

@Hannes Spaz: Ja hast recht war jetzt ein Denkfehler von mir!Hab nicht drauf geachtet, das die Funktion in der Klasse steht! Die Klasse aufzurufen, sollte er doch selber schaffen!
mfg

Thomas :-)
Benutzeravatar
BernieMan
User
Beiträge: 4
Registriert: Sonntag 26. März 2006, 11:33
Kontaktdaten:

Also Leute,
ich bin noch am Lernen und am Buch lesen und für jede Anregung dankbar.
@Hannes-Spz
Dein 'hirnrissig' sehe Ich als Anfänger locker. Also kein Problem.

Danke für Eure Hilfe ...

Grüsse BM
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

@Python-Master-47
das will ich ihm nicht unterstellen, aber sieh mal:
wenn sich irgendwer hier ein bissel wissen anlesen mag, wäre es immer schön, hätte
er gleich ein ganzes, komplettes, funktionierendes code-stückchen, damit er es sogleich
ausprobieren kann ... - find ich!
und wenn man vl. in php (davon hab ich keine ahnung)
die klassen nicht aufrufen MUSS, dann ist es für diesen benutzer sicherlich eindeutig,
dass man das in einer anderen sprache auch nicht tun muss!

@BernieMan:
wenn es nicht daran lag, dass die klasse nicht aufgerufen wurde,
hätte ich jetzt übrigens nur noch als letzten tipp, dass der komandozeilenparameter
falsch übergeben wurde und das script sich nur DESHALB nicht ausführen lässt...
[size=85]"Unsere Situation ist immer die eines schwarzen Mannes der in einem schwarzen Keller einen schwarzen Hut sucht, den es vielleicht gar nicht gibt." Sir Karl R. Popper[/size]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Damit es mal irgendwie vorran geht poste ich einfach mal ein funktionierendes, lauffähiges Script:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-

class Testclass(object):
    def __init__(self, arg):
        self.arg = arg
        
        if self.arg in ['-h', '--hilfe']: 
            self.__hilfe()
   
    def __hilfe(self):
        print "Testausgabe"

def main():
    tc = Testclass('-h')

if __name__ == '__main__':
    main()
Zu erst einmal: wenn etwas unklar ist, erkläre ich es gerne.

In Zeile 1 und 2 ist erstmal die Shebang und das Encoding. Beides schadet nie und ist generell zu empfehlen.
Zeile 4 besagt, dass die Klasse Testclass von dem Objekt object erbt, also ist es eine New-Style Klasse. Ist im moment zwar nicht nötig, ich habe es mir aber Angewöhnt meine Klassen immer als New-Style Klassen zu definieren.
Die if-Anweisung in Zeile 8 habe ich auf zwei Zeilen aufgeteilt. Das ist klarer und entspricht dem Python Styleguide.
In Zeile 14 habe ich eine Funktion main() angelegt, die das Programm steuert. Die Ähnlichkeit mit der int main() aus C und C++ ist in diesem Fall durchaus erwünscht.
Zeilen 17 & 18 sind der Import-Hook. Das bedeutet, dass main() nur ausgeführt wird, wenn das Script direkt gestartet wird, wenn das Programm importiert wird wird main() nicht aufgerufen. Auch wieder etwas was hilfreich ist und nie schadet.

Achja, zum Parsen der Kommandozeilenoptionen gibt es schon das Modul optparse, welches seine Aufgabe sehr gut erfüllt. Seitdem es in der Stdlib ist, schreibe ich meine Parser nicht mehr selbst.
Zuletzt geändert von Leonidas am Sonntag 26. März 2006, 14:04, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BernieMan hat geschrieben:Was ist an folgendem Code falsch:

Code: Alles auswählen

import sys

class Testclass:

    def __init__(self,arg):
        self.arg = arg
        arg = sys.argv[1]
        if arg in ['-h', '--hilfe']: self.__hilfe()
    
    def __hilfe(self):
        print "Testausgabe"
Hi BernieMan!

Da läuft noch ein wenig daneben. Das ist aber nicht schlimm, es sind nur ein paar kleine Anfängerfehler:

- Du definierst den Parameter "arg", der irgendetwas übergeben bekommen soll. Nur was???
- Du definierst die Variable "self.arg", die du aber im gesamten Code nicht weiter verwendest.
- Du erstellst eine Klasse, rufst sie aber nicht auf.

Hier ein kleines Beispiel, in dem innerhalb der Klasse "sys.argv" ausgewertet wird:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import sys


#----------------------------------------------------------------------
class Testclass:
    
    #----------------------------------------------------------------------
    def __init__(self):
            
        args = sys.argv[1:] # alle Parameter, nur nicht der Programmname
        
        if ('-h' in args) or ('--help' in args): 
            self.hilfe()
        else:
            self.arbeite()

   
    #----------------------------------------------------------------------
    def hilfe(self):
        print "Testausgabe" 


    #----------------------------------------------------------------------
    def arbeite(self):
        print "Dann tun wir mal etwas..."



#----------------------------------------------------------------------
def main():
    t = Testclass()


#----------------------------------------------------------------------
if __name__ == "__main__":
    main()
mfg
Gerold
:-)

PS: In der Vorschau sehe ich soeben, dass Leonidas wieder mal ein wenig schneller war. :o
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

gerold hat geschrieben:In der Vorschau sehe ich soeben, dass Leonidas wieder mal ein wenig schneller war.
Dann muss ich noch einen drauf legen. ;-)

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import sys

class Testclass:
    
    def hilfe(self):
        print "Testausgabe" 

    def arbeite(self):
        print "Dann tun wir mal etwas..."


def main():
    args = sys.argv[1:] # alle Parameter, nur nicht der Programmname
    t = Testclass()
    if ('-h' in args) or ('--help' in args): 
        t.hilfe()
    else:
        t.arbeite()

if __name__ == "__main__":
    main()
Ich würde die Kommandozeilenparameter in der Funktion "main()" prüfen, da hier drinnen fest steht, dass das Modul nicht importiert sondern direkt aufgerufen wurde. Falls das Modul importiert wurde, kann der Programmierer direkt entscheiden, welche der Klassenmethoden aufgerufen werden soll. So mischt sich dieses Modul nicht in die Parameterauswertung importierender Programme ein.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Warum benutzt hier keiner optparse oder getopt? Siehe die entsprechenden Beispiele aus der stdlib.
--- Heiko.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

modelnine hat geschrieben:Warum benutzt hier keiner optparse oder getopt?
Hi modelnine!

Ich denke mal, weil es nur ein Anfängerbeispiel ist um die Grundlagen zu verstehen. Es geht nicht primär um das Auswerten der Kommandozeilenargumente.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

modelnine hat geschrieben:Warum benutzt hier keiner optparse oder getopt? Siehe die entsprechenden Beispiele aus der stdlib.
Habe ich doch vorgeschlagen:
Leonidas hat geschrieben:Achja, zum Parsen der Kommandozeilenoptionen gibt es schon das Modul optparse, welches seine Aufgabe sehr gut erfüllt.
qerold hat geschrieben:Ich denke mal, weil es nur ein Anfängerbeispiel ist um die Grundlagen zu verstehen. Es geht nicht primär um das Auswerten der Kommandozeilenargumente.
*zustimmend-nick*
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Habe ich doch vorgeschlagen:
Huh, hab ich nicht gelesen...
--- Heiko.
Benutzeravatar
BernieMan
User
Beiträge: 4
Registriert: Sonntag 26. März 2006, 11:33
Kontaktdaten:

Hey Ihr seid aber gut drauf und habt ein Ohr für Anfänger ...

Vielen Dank für die Beispiele und Erklärungen. Das hat mir sehr geholfen. Wenn der Grundtenor in diesem Forum generell so ausfällt, dann bleibe ich in jedem Falle hier ... *begeistertbin*

Grüsse BM
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

gerold hat geschrieben:
gerold hat geschrieben:In der Vorschau sehe ich soeben, dass Leonidas wieder mal ein wenig schneller war.
Dann muss ich noch einen drauf legen. ;-)
Da bleibe ich nicht dahinter zurück:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-

import optparse

class Testclass(object):
    def __init__(self):
        parser = optparse.OptionParser()
        parser.add_option('-m', '--myhelp', action='callback', callback=self.hilfe)
                  
        options, args = parser.parse_args()
   
    def hilfe(self, option, opt, value, parser):
        print "Testausgabe"

def main():
    tc = Testclass()

if __name__ == '__main__':
    main()
Wobei optparse automatisch die -h und --help Optionen erstellt :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Hannes-Spz hat geschrieben:@Python-Master-47
das will ich ihm nicht unterstellen, aber sieh mal:
wenn sich irgendwer hier ein bissel wissen anlesen mag, wäre es immer schön, hätte
er gleich ein ganzes, komplettes, funktionierendes code-stückchen, damit er es sogleich
ausprobieren kann ... - find ich!
und wenn man vl. in php (davon hab ich keine ahnung)
die klassen nicht aufrufen MUSS, dann ist es für diesen benutzer sicherlich eindeutig,
dass man das in einer anderen sprache auch nicht tun muss!
Ok hast ja recht!Werd in Zukunft, vollständige Codes posten! 8)
mfg

Thomas :-)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Leonidas hat geschrieben:Da bleibe ich nicht dahinter zurück
:D
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten