Forum: GNU Radio Problem loading Python block

Posted by Nemanja Savic (Guest)
on 2013-01-25 17:07
(Received via mailing list)
Hi all,

today i was trying to make hierarchical signal processing block in 
Python.
I started with gr_modtool script, and configured it for hierpython block
type.

My idea was to design block similar to packet framer, so inside of the 
new
block, I connected binary slicer and Framer sink. I have also declared
message queue.

Outside of main block, I designed another block which should collect
messages sent by framer from the main block.

When I wanted to run this block, I got following error:


Traceback (most recent call last):
  File "/home/savi_ne/work/gnuradio/GRC/top_block.py", line 439, in 
<module>
    tb = top_block()
  File "/home/savi_ne/work/gnuradio/GRC/top_block.py", line 183, in 
__init__
    self.test_packet_proba_0 = test.packet_proba()
AttributeError: 'module' object has no attribute 'packet_proba'


Next I found that maybe I have to put following line in __init__.py 
file:

from packet_proba import *

After that I got similar error:

Traceback (most recent call last):
  File "/home/savi_ne/work/gnuradio/GRC/top_block.py", line 18, in 
<module>
    import test
  File "/usr/local/lib64/python2.6/site-packages/test/__init__.py", line
49, in <module>
    from packet_proba import *
  File "/usr/local/lib64/python2.6/site-packages/test/packet_proba.py",
line 51, in <module>
    class proba(gr.basic_block):
AttributeError: 'module' object has no attribute 'basic_block'

I have also tried with gr.block instead of gr.basic_block, but with
identical results.

Can anybody tell what's missing?

Thanks
Posted by Martin Braun (CEL) (Guest)
on 2013-01-25 17:39
(Received via mailing list)
For a hier block in Python, do

$ gr_modtool.py add -t hier -l python

You need 3.6.3 to do that.

Also, you'll need a new version of modtool (it usually lags a bit behind
changes in GNU Radio).

MB


On Fri, Jan 25, 2013 at 05:05:56PM +0100, Nemanja Savic wrote:
>
>   File "/home/savi_ne/work/gnuradio/GRC/top_block.py", line 439, in <module>
>
> 51, in <module>
>
> Thanks
>
>
> --
> Nemanja Savić
>

> _______________________________________________
> Discuss-gnuradio mailing list
> Discuss-gnuradio@gnu.org
> https://lists.gnu.org/mailman/listinfo/discuss-gnuradio


--
Karlsruhe Institute of Technology (KIT)
Communications Engineering Lab (CEL)

Dipl.-Ing. Martin Braun
Research Associate

Kaiserstraße 12
Building 05.01
76131 Karlsruhe

Phone: +49 721 608-43790
Fax: +49 721 608-46071
www.cel.kit.edu

KIT -- University of the State of Baden-Württemberg and
National Laboratory of the Helmholtz Association
Posted by Nemanja Savic (Guest)
on 2013-01-25 21:23
(Received via mailing list)
Thank you Martin, I will try that on Monday.
I suppose that I have older version of gr_modtool, cause there is no 
option
-l for selecting language.
My weekend would be maybe perfect If you or anybody else can explain to 
me
why my code won't work, cause I  have more or less copied block 
structure
from grextras.

Nice weekend
Nemanja
Posted by Nemanja Savic (Guest)
on 2013-01-28 10:29
(Received via mailing list)
I installed new version of gr_modtool script and it won't work. The 
error
is following:

[savi_ne@ts-070046nl gr-test]$ gr_modtool.py add -N rx_tx_message -t 
hier
-l python
Using Python < 2.7 possibly buggy. Ahem. Please send all complaints to
/dev/null.
Operating in directory .
GNU Radio module name identified: test
Language: Python
Block/code identifier: rx_tx_message
Enter valid argument list, including default arguments:
Add Python QA code? [Y/n] n
Traversing python...
Adding file 'rx_tx_message.py'...
Traceback (most recent call last):
  File "/usr/local/bin/gr_modtool.py", line 3369, in <module>
    main()
  File "/usr/local/bin/gr_modtool.py", line 3362, in main
    modtool.run()
  File "/usr/local/bin/gr_modtool.py", line 1339, in run
    self._run_python()
  File "/usr/local/bin/gr_modtool.py", line 1479, in _run_python
    self._write_tpl('block_python', 'python', fname_py)
  File "/usr/local/bin/gr_modtool.py", line 1324, in _write_tpl
    open(os.path.join(path, fname), 'w').write(get_template(tpl,
**self._info))
  File "/usr/local/bin/gr_modtool.py", line 870, in get_template
    return str(GRMTemplate(Templates[tpl_id], searchList=kwargs))
  File "/usr/local/bin/gr_modtool.py", line 865, in __init__
    Cheetah.Template.Template.__init__(self, src, searchList=searchList)
  File "/usr/lib64/python2.6/site-packages/Cheetah/Template.py", line 
1257,
in __init__
    self._compile(source, file, compilerSettings=compilerSettings)
  File "/usr/lib64/python2.6/site-packages/Cheetah/Template.py", line 
1551,
in _compile
    keepRefToGeneratedCode=True)
  File "/usr/lib64/python2.6/site-packages/Cheetah/Template.py", line 
795,
in compile
    raise parseError
Cheetah.Parser.ParseError:

Error in the Python code which Cheetah generated for this template:
================================================================================

expected an indented block (DynamicallyCompiledCheetahTemplate.py, line 
122)

Line|Python Code
----|-------------------------------------------------------------
120 |            deciminterp = ''
121 |        else: # generated from line 42, col 1
122 |        write(u'''from gnuradio import gr
                ^
123 |class ''')
124 |        _v = VFFSL(SL,"blockname",True) # u'${blockname}' on line 
46,
col 7
125 |        if _v is not None: write(_filter(_v, 
rawExpr=u'${blockname}'))
# from line 46, col 7.

================================================================================

Here is the corresponding Cheetah code.
** I had to guess the line & column numbers, so they are probably 
incorrect:

Line 42, column 1

Line|Cheetah Code
----|-------------------------------------------------------------
39  |#else if $blocktype == 'decimator'
40  |#set $deciminterp = ', <+decimation+>'
41  |#set $deciminterp = ''
42  |#else
     ^
43  |#end if
44  |from gnuradio import gr
45  |

Any suggestions how to ovecome this except using older version which 
worked
perfectly?
Posted by Nemanja Savic (Guest)
on 2013-01-28 16:43
(Received via mailing list)
Since I don't know why gr_modtool doesn't work for me, I took the older
working version and made very simple hier block in order to understand
messages flow in gnuradio.
The block code is following:

from gnuradio import gr

class msg_proba(gr.hier_block2):
    def __init__(self, ):
        gr.hier_block2.__init__(self, "msg_proba",
                gr.io_signature(1, 1, gr.sizeof_char),  # Input 
signature
                gr.io_signature(1, 1, gr.sizeof_char)) # Output 
signature

        gr_message_sink_0_msgq_out = gr_message_source_0_msgq_in =
gr.msg_queue(4)

        self.gr_message_source_0 = gr.message_source(gr.sizeof_char*1,
gr_message_source_0_msgq_in)
        self.gr_message_sink_0 = gr.message_sink(gr.sizeof_char*1,
gr_message_sink_0_msgq_out, False)

        self.connect(self, self.gr_message_sink_0)
        self.connect(self.gr_message_source_0, self)


and the test code is following:


from gnuradio import gr, gr_unittest
import test
import msg_proba

class qa_msg_proba (gr_unittest.TestCase):

    def setUp (self):
        self.tb = gr.top_block ()

    def tearDown (self):
        self.tb = None

    def test_001_msg_proba (self):

        self.src_data = ()
        self.expected_result = ()

        for i in range(51):
          self.src_data = self.src_data + (1,)
          self.expected_result = self.expected_result+(1,)

        self.src = gr.vector_source_b(self.src_data, False, 1)
        self.dst = gr.vector_sink_b ()

        self.msg_pr = msg_proba.msg_proba()

        self.tb.connect(self.src, self.msg_pr, self.dst)

        self.tb.run ()
        # check data
        result_data = dst.data ()
        self.assertEqual (expected_result, result_data)

if __name__ == '__main__':
    gr_unittest.main ()


When I run test, it doesn't finish. No errors, just stays active without
giving any results.
Can somebody provide some explanation?
Posted by Martin Braun (CEL) (Guest)
on 2013-01-28 17:07
(Received via mailing list)
- Try the latest gr_modtool from github
- What you're doing seems weird--why are you connecting message blocks?
  These are meant as a hackish solution to access samples from outside
  the flow graph. Perhaps you want the new PDU to stream blocks?

MB

On Mon, Jan 28, 2013 at 04:42:04PM +0100, Nemanja Savic wrote:
>         def __init__(self, ):
>     gr_message_sink_0_msgq_out, False)
>     from gnuradio import gr, gr_unittest
>
>             self.dst = gr.vector_sink_b ()
>     if __name__ == '__main__':
>
>     Operating in directory .
>
>     **self._info))
>       File "/usr/lib64/python2.6/site-packages/Cheetah/Template.py", line 795,
>
>     # from line 46, col 7.
>     Line|Cheetah Code
>
>         I suppose that I have older version of gr_modtool, cause there is no
>
>
>             >
>             declared message
>             >
>             >
>             >   File "/home/savi_ne/work/gnuradio/GRC/top_block.py", line 18,
>             > AttributeError: 'module' object has no attribute 'basic_block'
>             > Thanks
>             > https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
>             Building 05.01
>             Discuss-gnuradio mailing list
>
> Nemanja Savić
>

> _______________________________________________
> Discuss-gnuradio mailing list
> Discuss-gnuradio@gnu.org
> https://lists.gnu.org/mailman/listinfo/discuss-gnuradio


--
Karlsruhe Institute of Technology (KIT)
Communications Engineering Lab (CEL)

Dipl.-Ing. Martin Braun
Research Associate

Kaiserstraße 12
Building 05.01
76131 Karlsruhe

Phone: +49 721 608-43790
Fax: +49 721 608-46071
www.cel.kit.edu

KIT -- University of the State of Baden-Württemberg and
National Laboratory of the Helmholtz Association
Posted by Nemanja Savic (Guest)
on 2013-01-28 22:15
(Received via mailing list)
Hi all,

In my first post from today, where I reported error in gr_modtool, I was
using script downloaded from github this morning (just to clarifu how 
old
scriot I used).
Basically I am trying to make my own packet deframer block, and they are
more or less designed like that. This block was designed just to see how
messages work. In GRC when I connect them in that way it works, but in 
test
script above it doesn't work.
Basically the problem comes from making similar block like packet 
deframer,
but I am not able to import gr.block, or gr.basic_block in python (and
gr.hier_block2 works perfectly)

Cheers
Posted by Nemanja Savic (Guest)
on 2013-01-30 11:02
(Received via mailing list)
Guys,

i am not able to load gr.basic_block and make signal processing block in
Python. Simplu, there is no binding within gnuradio/gr for that class.
It works perfectly for gr.hier)block2 class.
What might be the problem?

Thanks
Posted by Tom Rondeau (Guest)
on 2013-01-30 11:02
(Received via mailing list)
On Tue, Jan 29, 2013 at 7:40 AM, Nemanja Savic <vlasinac@gmail.com> 
wrote:

>>         gr.hier_block2.__init__(
>> 1's and 0's" % (access_code,)
>>
>>         #    num_msg_outputs = 1
>
I have no idea what files these are from. Are they part of the GNU Radio
source code? I can't find references to them.



>
>
Sounds like you don't have something installed correctly. You wouldn't
normally be inheriting straight from gr_basic_block, but you should be 
able
to.


> And in tutorial on how to write signal processing block, it is stated to
> use gr.basic_block.
>

Which tutorial? Again, I don't think this is in the main GNU Radio 
source,
so please point out where you are getting this from.

Tom
Posted by Nemanja Savic (Guest)
on 2013-01-30 11:02
(Received via mailing list)
OK, I'll try to explain everything.

I want to design block responsible for decoding messages, calculating 
crc,
etc ... In order to do that I investigated packet_demod_base block from
main gnuradio branch,
and also packet_deframer from gr_extras group of blocks. I realized that
such kind of blocks consists of correlator, framer sink which acts like
message sink, and finally of some kind of message source. Framer sink 
sends
messages to message
source and message source then does packet checking and everything.

I also wanted to design my block in that fashion, so I used correlator 
and
framer sink and I wanted to design my own block which is able to receive
messages from packet framer and to check it. The code I provided in the
last post is my own, and not the part of gnuradio. Here is complete 
source
file of my block:

import numpy
from math import pi
from gnuradio import gr
from gruel import pmt
from gnuradio.digital import packet_utils
import gnuradio.digital as gr_digital


class packet_tst(gr.hier_block2):
    def __init__(self, access_code=None, threshold=-1):

        gr.hier_block2.__init__(
                self,
                "packet_tst",
                        gr.io_signature(1, 1, 1),  # Input signature
                        gr.io_signature(0, 0, 0) # Output signature
        )

        if not access_code:
            access_code = packet_utils.default_access_code
        if not packet_utils.is_1_0_string(access_code):
            raise ValueError, "Invalid access_code %r. Must be string of
1's and 0's" % (access_code,)

        if threshold == -1:
            threshold = 12              # FIXME raise exception

        msgq = gr.msg_queue(4)          # holds packets from the PHY
        self.correlator = 
gr_digital.correlate_access_code_bb(access_code,
threshold)

        self.framer_sink = gr.framer_sink_1(msgq)
        self.connect(self, self.correlator, self.framer_sink)

        self.hlp_blk = helper_block(msgq)

class helper_block(gr.basic_block):
    def __init__(self, msgq):
        gr.basic_block.__init__(
            self, name = "helper_block",
            in_sig = None, out_sig = None
        #    num_msg_outputs = 1
        )

    self._msgq = msgq


    def work(self, input_items, output_items):
        while True:
            try: msg = self._msgq.delete_head()
            except: return -1
            print "Message received"

At the moment the block is designed only to write something to standard
output if it receives a message. The problem is gr.basic_block as I
described in previous post. Python interpreter doesn't complain about
gr.hier_block2, but only about gr.basic_block.
The tutorial for writing blocks in python is from gnuradio.org:
http://gnuradio.org/redmine/projects/gnuradio/wiki...

Hope this helps.

Thanks
Posted by Tom Rondeau (Guest)
on 2013-01-30 11:02
(Received via mailing list)
On Tue, Jan 29, 2013 at 7:00 AM, Nemanja Savic <vlasinac@gmail.com> 
wrote:

> Guys,
>
> i am not able to load gr.basic_block and make signal processing block in
> Python. Simplu, there is no binding within gnuradio/gr for that class.
> It works perfectly for gr.hier)block2 class.
> What might be the problem?
>
> Thanks
>

I'm not sure what you mean by "load gr.basic_block." Do you mean inherit
from?

For signal processing endpoints, you want to use either gr_block,
gr_sync_block, gr_sync_decimator or gr_sync_interpolator.

Tom
Posted by Nemanja Savic (Guest)
on 2013-01-31 06:26
(Received via mailing list)
Today I have tried again, but this time i used block as is designed by
gr_modtool. It wont wen throught test, bu it reports:

AttributeError: 'module' object has no attribute 'sync_block'

It is becoming horror.
Posted by Martin Braun (CEL) (Guest)
on 2013-01-31 06:39
(Received via mailing list)
On Wed, Jan 30, 2013 at 01:23:19PM +0100, Nemanja Savic wrote:
> Today I have tried again, but this time i used block as is designed by
> gr_modtool. It wont wen throught test, bu it reports:
>
> AttributeError: 'module' object has no attribute 'sync_block'
>
>
> It is becoming horror.

Nemanja,

it seems like you haven't actually changed anything.

To recap:
- If you want Python blocks (gr.sync_block), you need > 3.6.3.
- You're doing something with messages (right?) Perhaps you want
  msg_connect() rather than the old message queues (read
  Johnathan's release announcement)

MB
--
Karlsruhe Institute of Technology (KIT)
Communications Engineering Lab (CEL)

Dipl.-Ing. Martin Braun
Research Associate

Kaiserstraße 12
Building 05.01
76131 Karlsruhe

Phone: +49 721 608-43790
Fax: +49 721 608-46071
www.cel.kit.edu

KIT -- University of the State of Baden-Württemberg and
National Laboratory of the Helmholtz Association
Posted by Nemanja Savic (Guest)
on 2013-01-31 09:16
(Received via mailing list)
In order to find which version I am using (since I have few build 
folders
on my computer, and I don't know from which gnuradio was installed, 
because
i tried a lot of times to install it without success (there were some
problems since I am using RHEL6)) I decided to uninstall everything and
make fresh new installation of gnuradio. I am receiving folloowing error
from cmake:

-- Uninstalling "/usr/local/share/doc/gnuradio-3.6.0/README"
> CMake Error at cmake_uninstall.cmake:20 (ELSEIF):
>   had incorrect arguments: IS_SYMLINK "$ENV{DESTDIR}${file}" (Unknown
>   arguments specified).
>
>
> make[3]: *** [CMakeFiles/uninstall] Error 1
> make[2]: *** [CMakeFiles/uninstall.dir/all] Error 2
> make[1]: *** [CMakeFiles/uninstall.dir/rule] Error 2
> make: *** [uninstall] Error 2
>

I simply tried to make this file, but then there was another file 
missing,
and so on.
Is there any other way to uninstall gnuradio?

Best
Posted by Martin Braun (CEL) (Guest)
on 2013-01-31 11:36
(Received via mailing list)
Just install 3.6.3, you should be fine.
Otherwise, manually browse through /usr/local and kill everything that
looks GNU Radio-ish.

MB

On Wed, Jan 30, 2013 at 04:13:20PM +0100, Nemanja Savic wrote:
>       arguments specified).
>
>
>     Nemanja,
>
>
>     Discuss-gnuradio@gnu.org
>     https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
>
>
>
>
>
> --
> Nemanja Savić
>

> _______________________________________________
> Discuss-gnuradio mailing list
> Discuss-gnuradio@gnu.org
> https://lists.gnu.org/mailman/listinfo/discuss-gnuradio


--
Karlsruhe Institute of Technology (KIT)
Communications Engineering Lab (CEL)

Dipl.-Ing. Martin Braun
Research Associate

Kaiserstraße 12
Building 05.01
76131 Karlsruhe

Phone: +49 721 608-43790
Fax: +49 721 608-46071
www.cel.kit.edu

KIT -- University of the State of Baden-Württemberg and
National Laboratory of the Helmholtz Association
Posted by Nemanja Savic (Guest)
on 2013-01-31 14:50
(Received via mailing list)
I deleted everything that was Gnu Radio-ish and istalled fresh new 
version.
But it doesn't work now. GRC won't start, it complains about environment
variable, I checket, they are good.
When I want to start uhd_fft I come the following error:

Traceback (most recent call last):
> "/usr/local/lib64/python2.6/site-packages/gnuradio/gr/gnuradio_core_runtime.py",
> line 24, in <module>
>     _gnuradio_core_runtime = swig_import_helper()
>   File
> "/usr/local/lib64/python2.6/site-packages/gnuradio/gr/gnuradio_core_runtime.py",
> line 20, in swig_import_helper
>     _mod = imp.load_module('_gnuradio_core_runtime', fp, pathname,
> description)
> ImportError: libgnuradio-core-3.6.4git.so.0.0.0: cannot open shared object
> fil
>

The problem is this objest does exist in this location: /usr/local/lib64

I am using RHEL6.

Best


On Thu, Jan 31, 2013 at 11:34 AM, Martin Braun (CEL)
Posted by Nemanja Savic (Guest)
on 2013-01-31 15:53
(Received via mailing list)
The problem was bad LD_LIBRARY_PATH.
Can anybody explain:
why with LD_LIBRARY_PATH=/usr/bin:usr/local/lib64:usr/local/lib, GRC 
won't
run, and with LD_LIBRARY_PATH=/usr/local/lib64. it works?
Posted by Tom Rondeau (Guest)
on 2013-02-01 04:44
(Received via mailing list)
On Thu, Jan 31, 2013 at 9:52 AM, Nemanja Savic <vlasinac@gmail.com> 
wrote:

> The problem was bad LD_LIBRARY_PATH.
> Can anybody explain:
> why with LD_LIBRARY_PATH=/usr/bin:usr/local/lib64:usr/local/lib, GRC won't
> run, and with LD_LIBRARY_PATH=/usr/local/lib64. it works?
>

My only guess for that is you have something left over in one of those
directories from a previous installation that's pointing to a wrong
version. (Also, I wouldn't think that a bin directory ever needs to be 
in
the library path.)

Tom
Posted by Nemanja Savic (Guest)
on 2013-02-02 09:15
(Received via mailing list)
Guys,

As i told you my new installation works fine, I eve tested blocks in
python. Now, the problem is following:

I designed block in python which has None for both input and output
signature. I wanted to use such block only for receiving messages and 
for
writing to terminal some information, etc.
The constructor of my new block, is executed, but the problem is work
function is never executed. I put some printing at the beginning of work
function and nothing happens. The work function looks like this:

    def work(self, input_items, output_items):
>         print "In work"
>         while True:
>             print "In loop"
>             try: msg = self._msgq.delete_head()
>             except: return -1
>             print "Message received"
>         return len(output_items[0])
>

In the flow graph, I have vector source and message sink which shares
message queue with my block. There are no errors.

Could the problem be no inputs and no outputs? Or maybe something else?

Best and thanks

Nemanja
Posted by Tom Rondeau (Guest)
on 2013-02-02 09:21
(Received via mailing list)
On Fri, Feb 1, 2013 at 10:12 AM, Nemanja Savic <vlasinac@gmail.com> 
wrote:

> function and nothing happens. The work function looks like this:
>>
>
> In the flow graph, I have vector source and message sink which shares
> message queue with my block. There are no errors.
>
> Could the problem be no inputs and no outputs? Or maybe something else?
>
> Best and thanks
>
> Nemanja
>

If I recall... you have to connect /something/, so add a line
'self.connect(self)'.

Tom
Posted by "Martin Lülf" <mail@mluelf.de> (Guest)
on 2013-02-02 09:24
(Received via mailing list)
> function and nothing happens. The work function looks like this:
>
>
> Could the problem be no inputs and no outputs? Or maybe something else?
>
> Best and thanks
>
> Nemanja
>


Hi Nemanja,

the work function is called by the scheduler, which only calls the work
function, if it has some samples to process. So if your block is not 
part
of the flow graph (which it isn't since you have no input or output
stream) it will not get called.

You could either create a Thread in the block's constructor which will
call the work function (the start/stop functions seem to not being 
called
either), or you could try the new message passing interface, where you 
can
register a callback function that is called whenever a new message
arrives.

Yours
Martin
Posted by Nemanja Savic (Guest)
on 2013-02-02 09:55
(Received via mailing list)
I am more than willing to try new message passing interface. The idea 
with
the thread is a bit old, that's what I have heard, from more experienced
guys. Are there any blocs that uses new message passing interface, so 
that
I can take a look how it works?

@Tom
Nothing happened by adding self.connect(self) in top_block.

This block design style i picked up from grExtras module. Maybe they use
different "something", and their block is called even when it has no
inputs/outputs.

Best
Nemanja
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.