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

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

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

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

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

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

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

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

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

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

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
Antworten