Variable aus Konsole einlesen

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
ovo
User
Beiträge: 5
Registriert: Mittwoch 30. April 2014, 18:24

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?
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

K.A. evtl. liegts daran das du einen String zuweist den du als Aufrufparameter übergibst aber f_center eine Float sein sollte.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@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.
ovo
User
Beiträge: 5
Registriert: Mittwoch 30. April 2014, 18:24

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?
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
ovo
User
Beiträge: 5
Registriert: Mittwoch 30. April 2014, 18:24

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

@ovo: Schau Dir mal *genau* an was da rechts und links vom ``==`` steht.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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

Nachtrag: Konvention sind *vier* Leerzeichen pro Ebene zum Einrücken.
ovo
User
Beiträge: 5
Registriert: Mittwoch 30. April 2014, 18:24

Der Fehler war nach __name, da hatte ich versehentlich ein Leerzeichen zu viel, danke.
ovo
User
Beiträge: 5
Registriert: Mittwoch 30. April 2014, 18:24

Ich habe nun mein Problem über die Shell gelöst.
Danke an Alle.
Antworten