Seite 1 von 1

Variable aus Konsole einlesen

Verfasst: Freitag 2. Mai 2014, 11:40
von ovo
Hi zusammen

Ich nutze GNU Radio Companion (GRC) um von meinem USRP Daten abzuspeichern.
Im GRC kann man Variablen definieren und Blöcke aneinander reihen und so eine Architektur erstellen, wie ich das gemacht habe.

Code: Alles auswählen

  +-----------------+            +------+            +----------+
  | UHD USRP Source |----------->| Head |----------->| Filesink |
  +-----------------+            +------+            +----------+ 
Das GRC speichert die Architektur mit Variablen und Blöcken als Python Dokument ab.
Ich möchte nun einfach nur über die Konsole einen Wert an dieses Python Script übergeben.

Im folgenden seht ihr die unveränderte Datei von GRC und anschliessend die von mir veränderte.

Code: Alles auswählen

#!/usr/bin/env python
##################################################
# Gnuradio Python Flow Graph
# Title: Top Block
# Generated: Fri May  2 11:59:11 2014
##################################################

from gnuradio import blocks
from gnuradio import eng_notation
from gnuradio import gr
from gnuradio import uhd
from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes
from optparse import OptionParser
import time

class top_block(gr.top_block):

    def __init__(self):
        gr.top_block.__init__(self, "Top Block")

        ##################################################
        # Variables
        ##################################################
        self.f_samp = f_samp = 10e6
        self.f_center = f_center = 1.57542e9
        self.USRP_Gain = USRP_Gain = 30
        self.USRP_BW = USRP_BW = 0

        ##################################################
        # Blocks
        ##################################################
        self.uhd_usrp_source_0 = uhd.usrp_source(
        	device_addr="addr=192.168.10.2",
        	stream_args=uhd.stream_args(
        		cpu_format="sc16",
        		channels=range(1),
        	),
        )
        self.uhd_usrp_source_0.set_samp_rate(f_samp)
        self.uhd_usrp_source_0.set_center_freq(f_center, 0)
        self.uhd_usrp_source_0.set_gain(USRP_Gain, 0)
        self.blocks_head_0 = blocks.head(gr.sizeof_short*2, int(f_samp*10e-3))
        self.blocks_file_sink_0 = blocks.file_sink(gr.sizeof_short*2, "/home/gnss/GNSS_Work/Architekturen/L1.dat", False)
        self.blocks_file_sink_0.set_unbuffered(False)

        ##################################################
        # Connections
        ##################################################
        self.connect((self.blocks_head_0, 0), (self.blocks_file_sink_0, 0))
        self.connect((self.uhd_usrp_source_0, 0), (self.blocks_head_0, 0))


# QT sink close method reimplementation

    def get_f_samp(self):
        return self.f_samp

    def set_f_samp(self, f_samp):
        self.f_samp = f_samp
        self.uhd_usrp_source_0.set_samp_rate(self.f_samp)

    def get_f_center(self):
        return self.f_center

    def set_f_center(self, f_center):
        self.f_center = f_center
        self.uhd_usrp_source_0.set_center_freq(self.f_center, 0)

    def get_USRP_Gain(self):
        return self.USRP_Gain

    def set_USRP_Gain(self, USRP_Gain):
        self.USRP_Gain = USRP_Gain
        self.uhd_usrp_source_0.set_gain(self.USRP_Gain, 0)

    def get_USRP_BW(self):
        return self.USRP_BW

    def set_USRP_BW(self, USRP_BW):
        self.USRP_BW = USRP_BW
        self.uhd_usrp_source_0.set_bandwidth(self.USRP_BW, 0)

if __name__ == '__main__':
    parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
    (options, args) = parser.parse_args()
    if gr.enable_realtime_scheduling() != gr.RT_OK:
        print "Error: failed to enable realtime scheduling."
    tb = top_block()
    tb.start()
    tb.wait()
Und nun die von mir geänderte Datei:
In Zeile 16, 20, 27 und 91 habe ich Änderungen angebracht.

Code: Alles auswählen

#!/usr/bin/env python
##################################################
# Gnuradio Python Flow Graph
# Title: Top Block
# Generated: Fri May  2 11:59:11 2014
##################################################

from gnuradio import blocks
from gnuradio import eng_notation
from gnuradio import gr
from gnuradio import uhd
from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes
from optparse import OptionParser
import time
import sys

class top_block(gr.top_block):

    def __init__(self, f_center):
        gr.top_block.__init__(self, "Top Block")

        ##################################################
        # Variables
        ##################################################
        self.f_samp = f_samp = 10e6
        self.f_center = f_center
        self.USRP_Gain = USRP_Gain = 30
        self.USRP_BW = USRP_BW = 0

        ##################################################
        # Blocks
        ##################################################
        self.uhd_usrp_source_0 = uhd.usrp_source(
        	device_addr="addr=192.168.10.2",
        	stream_args=uhd.stream_args(
        		cpu_format="sc16",
        		channels=range(1),
        	),
        )
        self.uhd_usrp_source_0.set_samp_rate(f_samp)
        self.uhd_usrp_source_0.set_center_freq(f_center, 0)
        self.uhd_usrp_source_0.set_gain(USRP_Gain, 0)
        self.blocks_head_0 = blocks.head(gr.sizeof_short*2, int(f_samp*10e-3))
        self.blocks_file_sink_0 = blocks.file_sink(gr.sizeof_short*2, "/home/gnss/GNSS_Work/Architekturen/L1.dat", False)
        self.blocks_file_sink_0.set_unbuffered(False)

        ##################################################
        # Connections
        ##################################################
        self.connect((self.blocks_head_0, 0), (self.blocks_file_sink_0, 0))
        self.connect((self.uhd_usrp_source_0, 0), (self.blocks_head_0, 0))


# QT sink close method reimplementation

    def get_f_samp(self):
        return self.f_samp

    def set_f_samp(self, f_samp):
        self.f_samp = f_samp
        self.uhd_usrp_source_0.set_samp_rate(self.f_samp)

    def get_f_center(self):
        return self.f_center

    def set_f_center(self, f_center):
        self.f_center = f_center
        self.uhd_usrp_source_0.set_center_freq(self.f_center, 0)

    def get_USRP_Gain(self):
        return self.USRP_Gain

    def set_USRP_Gain(self, USRP_Gain):
        self.USRP_Gain = USRP_Gain
        self.uhd_usrp_source_0.set_gain(self.USRP_Gain, 0)

    def get_USRP_BW(self):
        return self.USRP_BW

    def set_USRP_BW(self, USRP_BW):
        self.USRP_BW = USRP_BW
        self.uhd_usrp_source_0.set_bandwidth(self.USRP_BW, 0)

if __name__ == '__main__':
    parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
    (options, args) = parser.parse_args()
    if gr.enable_realtime_scheduling() != gr.RT_OK:
        print "Error: failed to enable realtime scheduling."
    tb = top_block()
    tb.f_center = sys.argv[1]
    tb.start()
    tb.wait()
Ich möchte die im orginial Dokument fixe Variable f_center neu aus der Konsole auslesen. Da ich aber keine Python Kenntnisse habe, habe ich einfach mal das versucht, was ich in einem kurzen Python Tutorial ausprobiert habe. Leider klappt es nicht.

Infos zum System:
Debian 7
Python 2.7

Wo mache ich den Fehler?

Re: Variable aus Konsole einlesen

Verfasst: Freitag 2. Mai 2014, 13:04
von darktrym
K.A. evtl. liegts daran das du einen String zuweist den du als Aufrufparameter übergibst aber f_center eine Float sein sollte.

Re: Variable aus Konsole einlesen

Verfasst: Freitag 2. Mai 2014, 13:21
von snafu
@ovo:

1. Baue mal zusätzlich in dein Programm ein ``print type(sys.argv[1])`` ein. Dann wirst du (hoffentlich) schnell sehen, wo das Problem liegt.

2. Das Setzen der Parameter wurde im Original-Programm bestimmt nicht ohne Grund über entsprechende Setter-Methoden realisiert. Man sieht das ja auch an dem jeweiligen Code, dass da beim Setzen von Werten noch ein zusätzlicher "interner" Aufruf gemacht wird. Du solltest also auch diese Setter-Methoden nutzen, anstatt ein Attribut direkt zu verändern, wenn wirklich etwas sinnvolles passieren soll. Übrigens: Wenn der Autor des Quelltextes an diesen Stellen ``@property``-Dekoratoren eingesetzt hätte, dann bestünde dieses Problem nicht - aber das ist ein anderes Thema.

EDIT: Eigentlich hätte ich die Reihenfolge der beiden Punkte umdrehen sollen. Problem 1 kommt erst zum Vorschein, wenn Problem 2 behoben wurde.

Re: Variable aus Konsole einlesen

Verfasst: Freitag 2. Mai 2014, 13:30
von ovo
ok, unterdessen habe ich noch was ausprobiert:

Code: Alles auswählen

import sys

class SayMyName:
  def __init__(self, myname)
     self.myname = myname
  def say(self):
     print "Hello, my name is", self.myname

if __name __ == '__main__':
   startName = sys.argv[1]
   name = SayMyName(startName)
   name.run()

Das geht leider auch nicht. Was mache ich da falsch?

Re: Variable aus Konsole einlesen

Verfasst: Freitag 2. Mai 2014, 13:32
von snafu
Naja, wenn du die Methode "say" definierst, dann solltest du sinnvollerweise auch "say" aufrufen und nicht "run". Letzteres ist nicht irgendein magischer Name, um ein Python-Programm zum Laufen zu bringen, falls du das dachtest.

Re: Variable aus Konsole einlesen

Verfasst: Freitag 2. Mai 2014, 13:40
von ovo
Ich habe nun den Doppelpunkt nach def __init__(self, myname) eingefügt und run zu say geändert.

Code: Alles auswählen

import sys

class SayMyName:
  def __init__(self, myname):
     self.myname = myname
  def say(self):
     print "Hello, my name is", self.myname

if __name __ == '__main__':
   startName = sys.argv[1]
   name = SayMyName(startName)
   name.say()
Die Konsole sagt:
File "testclass.py", line 9
if __name __ == '__main__':
^
SyntaxError: invalid syntax


Ich versteh nicht, was hier falsch sein soll.

Re: Variable aus Konsole einlesen

Verfasst: Freitag 2. Mai 2014, 13:46
von BlackJack
@ovo: Schau Dir mal *genau* an was da rechts und links vom ``==`` steht.

Re: Variable aus Konsole einlesen

Verfasst: Freitag 2. Mai 2014, 13:47
von /me
ovo hat geschrieben: File "testclass.py", line 9
if __name __ == '__main__':
^
SyntaxError: invalid syntax


Ich versteh nicht, was hier falsch sein soll.
Der Bezeichner heißt "__name__". Du hast da ein Leerzeichen zu viel und das führt zu falscher Syntax.

Re: Variable aus Konsole einlesen

Verfasst: Freitag 2. Mai 2014, 13:48
von BlackJack
Nachtrag: Konvention sind *vier* Leerzeichen pro Ebene zum Einrücken.

Re: Variable aus Konsole einlesen

Verfasst: Freitag 2. Mai 2014, 14:01
von ovo
Der Fehler war nach __name, da hatte ich versehentlich ein Leerzeichen zu viel, danke.

Re: Variable aus Konsole einlesen

Verfasst: Samstag 3. Mai 2014, 11:46
von ovo
Ich habe nun mein Problem über die Shell gelöst.
Danke an Alle.