Argumente übergeben bei einer Klasse mit optparse

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.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Argumente übergeben bei einer Klasse mit optparse

Beitragvon feldmaus » Donnerstag 26. Februar 2009, 14:49

Hallo Leute,

bei meinem Python Projekt wollte ich Argumente mit <optparse>
auslesen. Leider habe ich nur Beispiele zu einfachen Skripten
gesehen und keine Beispiele zu Klassen.

Mein Beispiel funktioniert zwar, aber ich finde das die Argumente
zu häufig vorkommen. Also einmal kommen die Argumente
bei der '__init__' Methode vor, dann kommen sie bei der
Instanzierung der Klasse nochmal vor.

Wie kann ich das vereinfachen?

Meine Klasse sieht zur Zeit wie folgt aus:

Code: Alles auswählen

from gnuradio import gr
from gnuradio.wxgui import fftsink2
from grc_gnuradio import usrp as grc_usrp
from grc_gnuradio import wxgui as grc_wxgui
from optparse import OptionParser
import wx
import time

class uebertragungschar_LF_RX(grc_wxgui.top_block_gui):

   def __init__(self, sub_dev_side='B', sub_dev_ant='RXB', usrp_freq_min=0, usrp_freq_max=29e3):
      grc_wxgui.top_block_gui.__init__(
         self, title="AM Receiver - Diplomarebeit - Markus Feldmann - Thu Feb 26 11:58:12 2009")

      ##################################################
      # Parameters
      ##################################################
      self.sub_dev_side = sub_dev_side
      self.sub_dev_ant = sub_dev_ant
      self.usrp_freq_min = usrp_freq_min
      self.usrp_freq_max = usrp_freq_max

      ##################################################
      # Variables
      ##################################################
      self.usrp_freq = usrp_freq = 0e3
      self.throttle_sample_rate = throttle_sample_rate = 32e3
      self.middle_freq_fft_plot = middle_freq_fft_plot = usrp_freq
      self.gain_usrp_source = gain_usrp_source = 0
      self.fft_plot_sample_rate = fft_plot_sample_rate = 32e3
      self.decimation_usrp_source = decimation_usrp_source = 128

. . .

if __name__ == '__main__':
   parser = OptionParser()
   parser.add_option("--subdev-side", dest="sub_dev_side", type="str", default='B',
                          help="select USRP side A or B")
   parser.add_option("--subdev-ant", dest="sub_dev_ant", type="str", default='RXB',
                          help="select USRP subdevice Antenna, for example RXA or RXB")
   parser.add_option("--usrp_freq_min", dest="usrp_freq_min", type="float", default=0)
   parser.add_option("--usrp_freq_max", dest="usrp_freq_max", type="float", default=29e3)
   (options, args) = parser.parse_args()
   tb = uebertragungschar_LF_RX(sub_dev_side=options.sub_dev_side, \
                    sub_dev_ant=options.sub_dev_ant, \
                    usrp_freq_min=options.usrp_freq_min, \
                    usrp_freq_max=options.usrp_freq_max)
   tb.Run()


Grüße Markus
Zuletzt geändert von feldmaus am Sonntag 7. Juni 2009, 13:07, insgesamt 2-mal geändert.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Beitragvon Barabbas » Donnerstag 26. Februar 2009, 15:00

du kannst einfach die Variabel options übergeben...

//edit: Die Instanz parser geht natürlich auch
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Beitragvon feldmaus » Donnerstag 26. Februar 2009, 15:35

Danke Barabbas,

ich hatte den Wald vor lauter Bäumen nicht gesehen. :lol:

So müsste es denn also aussehen:

Code: Alles auswählen

from gnuradio import gr
from gnuradio.wxgui import fftsink2
from grc_gnuradio import usrp as grc_usrp
from grc_gnuradio import wxgui as grc_wxgui
from optparse import OptionParser
import wx
import time


class uebertragungschar_LF_RX(grc_wxgui.top_block_gui):

   def __init__(self, options):
      grc_wxgui.top_block_gui.__init__(self,
         title="AM Receiver - Diplomarebeit - Markus Feldmann - Thu Feb 26 11:58:12 2009")

      ##################################################
      # Parameters
      ##################################################
      self.sub_dev_side = options.sub_dev_side
      self.sub_dev_ant = options.sub_dev_ant
      self.usrp_freq_min = options.usrp_freq_min
      self.usrp_freq_max = options.usrp_freq_max

      ##################################################
      # Variables
      ##################################################
      self.usrp_freq = usrp_freq = 0e3
      self.throttle_sample_rate = throttle_sample_rate = 32e3
      self.middle_freq_fft_plot = middle_freq_fft_plot = usrp_freq
      self.gain_usrp_source = gain_usrp_source = 0
      self.fft_plot_sample_rate = fft_plot_sample_rate = 32e3
      self.decimation_usrp_source = decimation_usrp_source = 128

      ##################################################


. . .


if __name__ == '__main__':
   parser = OptionParser()
   parser.add_option("--subdev-side", dest="sub_dev_side", type="str", default='B',
           help="select USRP side A or B")
   parser.add_option("--subdev-ant", dest="sub_dev_ant", type="str", default='RXB',
           help="select USRP subdevice Antenna, for example RXA or RXB")
   parser.add_option("--usrp_freq_min", dest="usrp_freq_min", type="float", default=0)
   parser.add_option("--usrp_freq_max", dest="usrp_freq_max", type="float", default=29e6)
   (options, args) = parser.parse_args()   
   tb = uebertragungschar_LF_RX(options)
   tb.Run()


Grüße Markus
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Beitragvon feldmaus » Sonntag 7. Juni 2009, 13:09

Wie übergibt man denn Argumente z.b. OPTIONS in diesem Fall ?

Code: Alles auswählen

class App(wx.App):

    def OnInit(self,OPTIONS):
        'Create the main window and insert the custom frame'
        frame = CanvasFrame()
        self.SetTopWindow(frame)
        frame.Show(True)
        return True

if __name__=='__main__':
    app = App(0,OPTIONS)
    app.MainLoop()


Bei mir kommt dann nämlich ein Fehler, der besagt das OnInit Argumente fehlen.

Grüße Markus
BlackJack

Beitragvon BlackJack » Sonntag 7. Juni 2009, 13:24

Gar nicht. Die werden doch schon der `App.__init__()` übergeben, da sollte doch alles wichtige schon an Attribute gebunden werden.
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Beitragvon feldmaus » Sonntag 7. Juni 2009, 13:39

BlackJack hat geschrieben:Gar nicht. Die werden doch schon der `App.__init__()` übergeben, da sollte doch alles wichtige schon an Attribute gebunden werden.


Das hatte ich schon fast vermutet. Wenn ich also mit Optionsparser was machen will,
dann wäre das so in wie in dem folgenden Beispiel ?

Code: Alles auswählen

class HistoApp(wx.App):
    def OnInit(self):
        . . .
   parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
   parser.add_option("--decim", dest="decim", type="eng_float", default=64)
   parser.add_option("--lpcf", dest="lpcf", type="eng_float", default=0.5)
   parser.add_option("--lptwf", dest="lptwf", type="eng_float", default=0.5)
   (options, args) = parser.parse_args()
        . . .
        self.frame = HistoFrame(starttime[0],
                                endtime[0],
                                timescale,
                                zeitspanne,
                                peaks_found,
                                parent=None,
                                title='Auswertung einer Mehrfrequenten Impulsmessung',
                                    size=(1024, 800))
        self.frame.Show()
        . . .

class HistoFrame(wx.Frame):
    def __init__(self,starttime,endtime,timescale,zeitspanne,peaks_found, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        . . .

if __name__ == '__main__':
    options = 1
    app = HistoApp(0)
    app.MainLoop()


Grüße Markus
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

Beitragvon Dill » Sonntag 7. Juni 2009, 13:46

was machst du da eigentlich genau bei deiner diplomarbeit?
... wenn ich mal fragen darf.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Sonntag 7. Juni 2009, 13:54

Wie BlackJack bereits sagte, kannst Du die Optionen durchaus App.__init__() als Argumente übergeben. Du musst also OptionParser nicht in der App aufrufen.
MfG
HWK
feldmaus
User
Beiträge: 284
Registriert: Donnerstag 12. Oktober 2006, 16:48

Beitragvon feldmaus » Sonntag 7. Juni 2009, 14:18

HWK hat geschrieben:Wie BlackJack bereits sagte, kannst Du die Optionen durchaus App.__init__() als Argumente übergeben. Du musst also OptionParser nicht in der App aufrufen.
MfG
HWK

Da ich keine App.__init__() habe, sondern nur OnInit(), muss ich die wohl noch anlegen ?!

Wo ist der Unterschied zwischen OnInit() und __init__() ich dachte das wäre
das gleiche?

@Dill
Also meine Diplomarbeit ist ein "Mehfrequentes Impulsmessverfahren zur Überwachung
von Teilentladungen bei Isolationen".

Grüße Markus
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Beitragvon HWK » Sonntag 7. Juni 2009, 14:29

Z.B. so:

Code: Alles auswählen

class MyApp(wx.App):
   def __init__(self, redirect=False, my_arg):
      wx.App.__init__(self, redirect)
      self.arg = my_arg

   def OnInit(self):
      ...
__init__ wird bei jeder Instanzierung einer Python-Klasse aufgerufen. OnInit ist eine spezielle Methode, die von wx.App.__init__ aufgerufen wird.
MfG
HWK

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], Majestic-12 [Bot]