Patrick, Thanks for the advice! So I added that string parameter(or char array) to the Top_Block.py file
the new line looks like this:self.ACK_Text_Sanitize_0 = ACK.Text_Sanitize("String"). When I run "python top_block.py" this error occurs: comm1@comm1:~/Logan/Thesis$ python top_block.py Traceback (most recent call last): File "top_block.py", line 92, in <module> tb = top_block() File "top_block.py", line 65, in __init__ self.ACK_Text_Sanitize_0 = ACK.Text_Sanitize("String") File "/usr/local/lib/python2.7/dist-packages/ACK/ACK_swig.py", line 399, in make return _ACK_swig.Text_Sanitize_make(*args, **kwargs) RuntimeError: attempt to set_msg_handler() on bad input message port! My XML file can be found here: https://gist.github.com/loganwashbourne/68367a93b7fe9bf28bce So the RuntimeError seems to be the problem, I'm leaning towards the idea that I am not handling the PMT's correctly. Thoughts? Richard, I appreciate the advice, I've been pretty diligent about using sudo ldconfig after I read that not using it could create problems. All advice helps! Logan Washbourne Electrical Engineering Graduate Student (Electromagnetics) On Fri, Aug 21, 2015 at 4:37 PM, Patrick Sathyanathan <wp...@hotmail.com> wrote: > I see the following in the output of "nm -C -u": > > U gr::ACK::Text_Sanitize_impl::forecast(int, std::vector<int, > std::allocator<int> >&) > > This was the undefined symbol that was causing the module import to > fail... as you have discovered yourself. Now that the module import has > succeeded you are seeing a different error. > > This error is because of the following in the generated python file: > > self.ACK_Text_Sanitize_0 = ACK.Text_Sanitize() > > Note that this will invoke "Text_Sanitize::make" which expects a "char * > message" argument. That causes the error message below. For some reason GRC > is not adding that parameter in the above statement. Did you add a > declaration for that parameter in the XML file ? > > To verify that the XML file is the issue just try editing the generated > python file and changing the above to: > > self.ACK_Text_Sanitize_0 = ACK.Text_Sanitize("some string") > > and running it from the command line (run "python top_block.py" in a > terminal window). > > --Patrick > > ------------------------------ > Date: Thu, 20 Aug 2015 11:08:56 -0500 > From: lwas...@ostatemail.okstate.edu > To: discuss-gnuradio@gnu.org > > Subject: Re: [Discuss-gnuradio] OOT Module Attribute Error module object > has no attribute 'blockname' > > Nathan and Patrick, > > Thanks for the tips! > > I started with running: nm -C -u libgnuradio-<modulename>.so > > and the results of that can be found here: > https://gist.github.com/loganwashbourne under the *nm -C -u > libgnuradio-<modulename>.so* > <https://gist.github.com/loganwashbourne/3bb90d787308b45211d0> file. (I > think github thinks I'm a robot so I can't link to the direct page yet). > > I'll be honest, I'm not really sure what I'm looking at in this return, I > do see some error statements but I'm not sure if they are just stating how > it would handle an error or if it is an actual error. > > I really don't think I have any callbacks in my XML code, I just reference > certain input variables in the XML code. > > Next, the ACK_swig.i file can be found here : > https://gist.github.com/loganwashbourne under the same file name. I > checked it against the gr-tutorial swig file and the only difference was > that the ACK_swig.i file included a magic2 function call for each of my OOT > blocks(check and Text_Sanitize), while the gr-tutorial didn't. > > Last thing, I realized that I am creating the forecast function in the > Text_Sanitize_impl.h file but not referencing it it the .cc file (I > commented it out). I tried commenting out the void deceleration of the > forecast function in the .h file but then I get a new error when I try to > run the grc file(which is just a constant int source connected to my > Text_Sanitize block, which is connected the the message debug "print" port). > > The new error is : > > Traceback (most recent call last): > File "/home/comm1/Logan/Thesis/top_block.py", line 92, in <module> > tb = top_block() > File "/home/comm1/Logan/Thesis/top_block.py", line 65, in __init__ > self.ACK_Text_Sanitize_0 = ACK.Text_Sanitize() > File "/usr/local/lib/python2.7/dist-packages/ACK/ACK_swig.py", line 399, > in make > return _ACK_swig.Text_Sanitize_make(*args, **kwargs) > TypeError: Required argument 'message' (pos 1) not found > > I do apologize for the long questions, if any of you feel like I need to > spend more time looking into this myself before asking the mailing list, > please don't hesitate to mention it. > > > > Logan Washbourne > Electrical Engineering Graduate Student > (Electromagnetics) > > > On Wed, Aug 19, 2015 at 5:06 PM, Patrick Sathyanathan <wp...@hotmail.com> > wrote: > > Hi Logan, > > I have faced the same error twice recently in my OOT module and finally > tracked it down to two causes. The basic reason for the 'object has no > attribute' error is that Python's import of your module failed. In the two > cases that I saw it was due to undefined symbols in the shared library for > my module. My module was called 'tutorial' so the corresponding library is > libgnuradio-tutorial.so and you can find it in the .../build/lib directory. > To find out the undefined symbols do the following: > > nm -C -u libgnuradio-<modulename>.so > > and search for method names in your class. So if your class is 'MyClass' > you could do: > > nm -C -u libgnuradio-<modulename>.so | grep MyClass > > The two cases that I ran into were: > > 1. A non-virtual method in my implementation class was undefined because I > had forgotten to prefix the method definition with the class name. So the > .cc file had "void foo(...)" instead of "void MyClass_impl::foo(...)" and > foo was compiled as a ordinary function. Then the command above will report > "MyClass_impl::foo" as undefined. > > 2. The second case I ran into was with defining callbacks in the XML file. > If you do then you will need to add matching virtual function declarations > in the header file. This is needed for SWIG to work correctly. For my case > the callback "foo" needed a virtual function declaration "virtual > <sometype> foo(...) = 0;" in the actual class declaration (not the ..._impl > version) in the header file. > > Do you have callbacks ? If this is the issue then you should do a "make > clean" before running make again to force SWIG to run. > > Hope this helps. > > --Patrick > > ------------------------------ > Date: Wed, 19 Aug 2015 14:51:27 -0400 > From: n...@ostatemail.okstate.edu > To: lwas...@ostatemail.okstate.edu > CC: discuss-gnuradio@gnu.org > Subject: Re: [Discuss-gnuradio] OOT Module Attribute Error module object > has no attribute 'blockname' > > > My gut is telling me this is a swig problem. I don't know that it's > frowned upon, but it's not easy to read without some kind of highlighting > that we'd get from github or a gist with files. If I'm correct we'd also > need to see swig/ACK.i (probably missing an include and/or gr swig block > magic. compare to tutorial swig for sanity check) > > On Wed, Aug 19, 2015 at 10:38 AM, Washbourne, Logan < > lwas...@ostatemail.okstate.edu> wrote: > > Hello all, > > I know this question has been asked before, several times, but I didn't > find a solution that allowed me to use my OOT blocks without running into > the error stated in the subject of this email. > > I scoured through this webpage( > http://gnuradio.org/redmine/projects/gnuradio/wiki/OutOfTreeModulesConfig) > and tried adding: > set(GR_REQUIRED_COMPONENTS RUNTIME PMT) > > to my top level CMakeLists.txt file, because I am using PMT objects in my > block, but that didn't get rid of the error. > > The full error thrown is this: > > Executing: "/home/comm1/Logan/Thesis/top_block.py" > > Traceback (most recent call last): > File "/home/comm1/Logan/Thesis/top_block.py", line 92, in <module> > tb = top_block() > File "/home/comm1/Logan/Thesis/top_block.py", line 65, in __init__ > self.ACK_Text_Sanitize_0 = ACK.Text_Sanitize() > AttributeError: 'module' object has no attribute 'Text_Sanitize' > > > I looked on the mailing list for that last line error and it pointed me to > doing what I mentioned above with the CMakeLists.txt file, but could it be > an actual problem with the top_block.py file? > > In the addendum is all of the files I could think would be necessary for > someone to look at if they chose to, if including this much text is frowned > upon, please let me know. > > > Addendum: > > Text_Sanitize_impl.cc > > ***************************************************************************** > #ifdef HAVE_CONFIG_H > #include "config.h" > #endif > > #include <gnuradio/io_signature.h> > #include "Text_Sanitize_impl.h" > #include <pmt/pmt.h> > #include <stdio.h> > #include <string> > #include <iostream> > #include <cstdio> > > namespace gr { > namespace ACK { > > Text_Sanitize::sptr > Text_Sanitize::make(char* message) > { > return gnuradio::get_initial_sptr > (new Text_Sanitize_impl(message)); > } > > void > Text_Sanitize_impl::print_message(pmt::pmt_t d_message) > { > pmt::print(d_message); > } > > > > > /* > void > Text_Sanitize_impl::forecast (int noutput_items, gr_vector_int > &ninput_items_required) > { > <+forecast+> e.g. ninput_items_required[0] = noutput_items > } > */ > int > Text_Sanitize_impl::general_work (int noutput_items, > gr_vector_int &ninput_items, > gr_vector_const_void_star &input_items, > gr_vector_void_star &output_items) > { > const int *in = (int *) input_items[0]; > pmt::pmt_t *out = (pmt::pmt_t *) output_items[0]; > > > d_out_msg = pmt::string_to_symbol(d_message); > //for(int i = 0; i<strlen(d_message); i++) > //{ > // pmt::vector_set(d_out_msg,i,d_message[i]); > //} > > // Do <+signal processing+> > // Tell runtime system how many input items we consumed on > // each input stream. > consume_each (noutput_items); > > // Tell runtime system how many output items we produced. > return noutput_items; > } > > /* > * The private constructor > */ > Text_Sanitize_impl::Text_Sanitize_impl(char* message) > : gr::block("Text_Sanitize", > gr::io_signature::make(1, 1, sizeof(int)), > gr::io_signature::make(1, 1, sizeof(pmt::pmt_t))), > d_out_msg(pmt::string_to_symbol(std::string(""))), > d_message(message) > { > > message_port_register_out(pmt::mp("print_message")); > set_msg_handler(pmt::mp("print"), > boost::bind(&Text_Sanitize_impl::print_message, this, _1)); > } > > /* > * Our virtual destructor. > */ > Text_Sanitize_impl::~Text_Sanitize_impl() > { > } > > > } /* namespace ACK */ > } /* namespace gr */ > > > ***************************************************************************** > > Text_Sanitize_impl.h > > ****************************************************************************** > #ifndef INCLUDED_ACK_TEXT_SANITIZE_IMPL_H > #define INCLUDED_ACK_TEXT_SANITIZE_IMPL_H > > #include <ACK/Text_Sanitize.h> > #include <gnuradio/block.h> > #include <gnuradio/thread/thread.h> > #include <pmt/pmt.h> > > namespace gr { > namespace ACK { > > class Text_Sanitize_impl : public Text_Sanitize > { > private: > // Nothing to declare in this block. > pmt::pmt_t d_out_msg; > char* d_message; > void print_message(pmt::pmt_t d_message); > > > public: > Text_Sanitize_impl(char* message); > ~Text_Sanitize_impl(); > > // Where all the action really happens > void forecast (int noutput_items, gr_vector_int > &ninput_items_required); > > int general_work(int noutput_items, > gr_vector_int &ninput_items, > gr_vector_const_void_star &input_items, > gr_vector_void_star &output_items); > }; > > } // namespace ACK > } // namespace gr > > #endif /* INCLUDED_ACK_TEXT_SANITIZE_IMPL_H */ > > > ***************************************************************************** > > Text_Sanitize.h > > **************************************************************************** > #ifndef INCLUDED_ACK_TEXT_SANITIZE_H > #define INCLUDED_ACK_TEXT_SANITIZE_H > > #include <ACK/api.h> > #include <gnuradio/block.h> > > namespace gr { > namespace ACK { > > /*! > * \brief <+description of block+> > * \ingroup ACK > * > */ > class ACK_API Text_Sanitize : virtual public gr::block > { > public: > typedef boost::shared_ptr<Text_Sanitize> sptr; > > /*! > * \brief Return a shared_ptr to a new instance of > ACK::Text_Sanitize. > * > * To avoid accidental use of raw pointers, ACK::Text_Sanitize's > * constructor is in a private implementation > * class. ACK::Text_Sanitize::make is the public interface for > * creating new instances. > */ > static sptr make(char* message); > }; > > } // namespace ACK > } // namespace gr > > #endif /* INCLUDED_ACK_TEXT_SANITIZE_H */ > > **************************************************************************** > > Top Level CMakeLists.txt > *************************************************************************** > ######################################################################## > # Project setup > ######################################################################## > cmake_minimum_required(VERSION 2.6) > project(gr-ACK CXX C) > enable_testing() > > #select the release build type by default to get optimization flags > if(NOT CMAKE_BUILD_TYPE) > set(CMAKE_BUILD_TYPE "Release") > message(STATUS "Build type not specified: defaulting to release.") > endif(NOT CMAKE_BUILD_TYPE) > set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "") > > #make sure our local CMake Modules path comes first > list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_SOURCE_DIR}/cmake/Modules) > > ######################################################################## > # Compiler specific setup > ######################################################################## > if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32) > #http://gcc.gnu.org/wiki/Visibility > add_definitions(-fvisibility=hidden) > endif() > > ######################################################################## > # Find boost > ######################################################################## > if(UNIX AND EXISTS "/usr/lib64") > list(APPEND BOOST_LIBRARYDIR "/usr/lib64") #fedora 64-bit fix > endif(UNIX AND EXISTS "/usr/lib64") > set(Boost_ADDITIONAL_VERSIONS > "1.35.0" "1.35" "1.36.0" "1.36" "1.37.0" "1.37" "1.38.0" "1.38" > "1.39.0" "1.39" > "1.40.0" "1.40" "1.41.0" "1.41" "1.42.0" "1.42" "1.43.0" "1.43" > "1.44.0" "1.44" > "1.45.0" "1.45" "1.46.0" "1.46" "1.47.0" "1.47" "1.48.0" "1.48" > "1.49.0" "1.49" > "1.50.0" "1.50" "1.51.0" "1.51" "1.52.0" "1.52" "1.53.0" "1.53" > "1.54.0" "1.54" > "1.55.0" "1.55" "1.56.0" "1.56" "1.57.0" "1.57" "1.58.0" "1.58" > "1.59.0" "1.59" > "1.60.0" "1.60" "1.61.0" "1.61" "1.62.0" "1.62" "1.63.0" "1.63" > "1.64.0" "1.64" > "1.65.0" "1.65" "1.66.0" "1.66" "1.67.0" "1.67" "1.68.0" "1.68" > "1.69.0" "1.69" > ) > find_package(Boost "1.35" COMPONENTS filesystem system) > > if(NOT Boost_FOUND) > message(FATAL_ERROR "Boost required to compile ACK") > endif() > > ######################################################################## > # Install directories > ######################################################################## > include(GrPlatform) #define LIB_SUFFIX > set(GR_RUNTIME_DIR bin) > set(GR_LIBRARY_DIR lib${LIB_SUFFIX}) > set(GR_INCLUDE_DIR include/ACK) > set(GR_DATA_DIR share) > set(GR_PKG_DATA_DIR ${GR_DATA_DIR}/${CMAKE_PROJECT_NAME}) > set(GR_DOC_DIR ${GR_DATA_DIR}/doc) > set(GR_PKG_DOC_DIR ${GR_DOC_DIR}/${CMAKE_PROJECT_NAME}) > set(GR_CONF_DIR etc) > set(GR_PKG_CONF_DIR ${GR_CONF_DIR}/${CMAKE_PROJECT_NAME}/conf.d) > set(GR_LIBEXEC_DIR libexec) > set(GR_PKG_LIBEXEC_DIR ${GR_LIBEXEC_DIR}/${CMAKE_PROJECT_NAME}) > set(GRC_BLOCKS_DIR ${GR_PKG_DATA_DIR}/grc/blocks) > > ######################################################################## > # On Apple only, set install name and use rpath correctly, if not already > set > ######################################################################## > if(APPLE) > if(NOT CMAKE_INSTALL_NAME_DIR) > set(CMAKE_INSTALL_NAME_DIR > ${CMAKE_INSTALL_PREFIX}/${GR_LIBRARY_DIR} CACHE > PATH "Library Install Name Destination Directory" FORCE) > endif(NOT CMAKE_INSTALL_NAME_DIR) > if(NOT CMAKE_INSTALL_RPATH) > set(CMAKE_INSTALL_RPATH > ${CMAKE_INSTALL_PREFIX}/${GR_LIBRARY_DIR} CACHE > PATH "Library Install RPath" FORCE) > endif(NOT CMAKE_INSTALL_RPATH) > if(NOT CMAKE_BUILD_WITH_INSTALL_RPATH) > set(CMAKE_BUILD_WITH_INSTALL_RPATH ON CACHE > BOOL "Do Build Using Library Install RPath" FORCE) > endif(NOT CMAKE_BUILD_WITH_INSTALL_RPATH) > endif(APPLE) > > ######################################################################## > # Find gnuradio build dependencies > ######################################################################## > find_package(CppUnit) > find_package(Doxygen) > > # Search for GNU Radio and its components and versions. Add any > # components required to the list of GR_REQUIRED_COMPONENTS (in all > # caps such as FILTER or FFT) and change the version to the minimum > # API compatible version required. > set(GR_REQUIRED_COMPONENTS RUNTIME PMT STRING) > find_package(Gnuradio "3.7.2" REQUIRED) > > if(NOT CPPUNIT_FOUND) > message(FATAL_ERROR "CppUnit required to compile ACK") > endif() > > ######################################################################## > # Setup doxygen option > ######################################################################## > if(DOXYGEN_FOUND) > option(ENABLE_DOXYGEN "Build docs using Doxygen" ON) > else(DOXYGEN_FOUND) > option(ENABLE_DOXYGEN "Build docs using Doxygen" OFF) > endif(DOXYGEN_FOUND) > > ######################################################################## > # Setup the include and linker paths > ######################################################################## > include_directories( > ${CMAKE_SOURCE_DIR}/lib > ${CMAKE_SOURCE_DIR}/include > ${CMAKE_BINARY_DIR}/lib > ${CMAKE_BINARY_DIR}/include > ${Boost_INCLUDE_DIRS} > ${CPPUNIT_INCLUDE_DIRS} > ${GNURADIO_RUNTIME_INCLUDE_DIRS} > ${GNURADIO_ALL_INCLUDE_DIRS} > ) > > link_directories( > ${Boost_LIBRARY_DIRS} > ${CPPUNIT_LIBRARY_DIRS} > ${GNURADIO_RUNTIME_LIBRARY_DIRS} > ) > > # Set component parameters > set(GR_ACK_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include CACHE INTERNAL > "" FORCE) > set(GR_ACK_SWIG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/swig CACHE > INTERNAL "" FORCE) > > ######################################################################## > # Create uninstall target > ######################################################################## > configure_file( > ${CMAKE_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in > ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake > @ONLY) > > add_custom_target(uninstall > ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake > ) > > ######################################################################## > # Add subdirectories > ######################################################################## > add_subdirectory(include/ACK) > add_subdirectory(lib) > add_subdirectory(swig) > add_subdirectory(python) > add_subdirectory(grc) > add_subdirectory(apps) > add_subdirectory(docs) > > ######################################################################## > # Install cmake search helper for this library > ######################################################################## > if(NOT CMAKE_MODULES_DIR) > set(CMAKE_MODULES_DIR lib${LIB_SUFFIX}/cmake) > endif(NOT CMAKE_MODULES_DIR) > > install(FILES cmake/Modules/ACKConfig.cmake > DESTINATION ${CMAKE_MODULES_DIR}/ACK > ) > *************************************************************************** > > top_block.py > *************************************************************************** > #!/usr/bin/env python2 > ################################################## > # GNU Radio Python Flow Graph > # Title: Top Block > # Generated: Tue Aug 18 11:02:34 2015 > ################################################## > > if __name__ == '__main__': > import ctypes > import sys > if sys.platform.startswith('linux'): > try: > x11 = ctypes.cdll.LoadLibrary('libX11.so') > x11.XInitThreads() > except: > print "Warning: failed to XInitThreads()" > > from PyQt4 import Qt > from gnuradio import analog > from gnuradio import blocks > from gnuradio import eng_notation > from gnuradio import gr > from gnuradio.eng_option import eng_option > from gnuradio.filter import firdes > from optparse import OptionParser > import ACK > import sys > > > class top_block(gr.top_block, Qt.QWidget): > > def __init__(self): > gr.top_block.__init__(self, "Top Block") > Qt.QWidget.__init__(self) > self.setWindowTitle("Top Block") > try: > self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc')) > except: > pass > self.top_scroll_layout = Qt.QVBoxLayout() > self.setLayout(self.top_scroll_layout) > self.top_scroll = Qt.QScrollArea() > self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame) > self.top_scroll_layout.addWidget(self.top_scroll) > self.top_scroll.setWidgetResizable(True) > self.top_widget = Qt.QWidget() > self.top_scroll.setWidget(self.top_widget) > self.top_layout = Qt.QVBoxLayout(self.top_widget) > self.top_grid_layout = Qt.QGridLayout() > self.top_layout.addLayout(self.top_grid_layout) > > self.settings = Qt.QSettings("GNU Radio", "top_block") > self.restoreGeometry(self.settings.value("geometry").toByteArray()) > > ################################################## > # Variables > ################################################## > self.samp_rate = samp_rate = 32000 > > ################################################## > # Blocks > ################################################## > self.blocks_message_debug_0 = blocks.message_debug() > self.analog_const_source_x_0 = analog.sig_source_i(0, > analog.GR_CONST_WAVE, 0, 0, 2) > self.ACK_Text_Sanitize_0 = ACK.Text_Sanitize() > > ################################################## > # Connections > ################################################## > self.msg_connect((self.ACK_Text_Sanitize_0, 'out'), > (self.blocks_message_debug_0, 'print')) > self.connect((self.analog_const_source_x_0, 0), > (self.ACK_Text_Sanitize_0, 0)) > > def closeEvent(self, event): > self.settings = Qt.QSettings("GNU Radio", "top_block") > self.settings.setValue("geometry", self.saveGeometry()) > event.accept() > > def get_samp_rate(self): > return self.samp_rate > > def set_samp_rate(self, samp_rate): > self.samp_rate = samp_rate > > > if __name__ == '__main__': > parser = OptionParser(option_class=eng_option, usage="%prog: > [options]") > (options, args) = parser.parse_args() > from distutils.version import StrictVersion > if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"): > > Qt.QApplication.setGraphicsSystem(gr.prefs().get_string('qtgui','style','raster')) > qapp = Qt.QApplication(sys.argv) > tb = top_block() > tb.start() > tb.show() > > def quitting(): > tb.stop() > tb.wait() > qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting) > qapp.exec_() > tb = None # to clean up Qt widgets > *************************************************************************** > > Logan Washbourne > Electrical Engineering Graduate Student > (Electromagnetics) > > > _______________________________________________ > Discuss-gnuradio mailing list > Discuss-gnuradio@gnu.org > https://lists.gnu.org/mailman/listinfo/discuss-gnuradio > > > > _______________________________________________ Discuss-gnuradio mailing > list Discuss-gnuradio@gnu.org > https://lists.gnu.org/mailman/listinfo/discuss-gnuradio > > > > _______________________________________________ Discuss-gnuradio mailing > list Discuss-gnuradio@gnu.org > https://lists.gnu.org/mailman/listinfo/discuss-gnuradio >
_______________________________________________ Discuss-gnuradio mailing list Discuss-gnuradio@gnu.org https://lists.gnu.org/mailman/listinfo/discuss-gnuradio