summaryrefslogtreecommitdiff
path: root/grc/python
diff options
context:
space:
mode:
Diffstat (limited to 'grc/python')
-rw-r--r--grc/python/FlowGraph.py22
-rw-r--r--grc/python/Generator.py8
-rw-r--r--grc/python/Param.py2
3 files changed, 25 insertions, 7 deletions
diff --git a/grc/python/FlowGraph.py b/grc/python/FlowGraph.py
index bedf9ccf33..686dae70fa 100644
--- a/grc/python/FlowGraph.py
+++ b/grc/python/FlowGraph.py
@@ -17,6 +17,7 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
"""
import re
+import imp
from operator import methodcaller
from . import expr_utils
@@ -203,6 +204,12 @@ class FlowGraph(_FlowGraph, _GUIFlowGraph):
self.iter_enabled_blocks())
return monitors
+ def get_python_modules(self):
+ """Iterate over custom code block ID and Source"""
+ for block in self.iter_enabled_blocks():
+ if block.get_key() == 'epy_module':
+ yield block.get_id(), block.get_param('source_code').get_value()
+
def get_bussink(self):
bussink = filter(lambda b: _bussink_searcher.search(b.get_key()), self.get_enabled_blocks())
@@ -213,8 +220,6 @@ class FlowGraph(_FlowGraph, _GUIFlowGraph):
return False
-
-
def get_bussrc(self):
bussrc = filter(lambda b: _bussrc_searcher.search(b.get_key()), self.get_enabled_blocks())
@@ -278,9 +283,18 @@ class FlowGraph(_FlowGraph, _GUIFlowGraph):
#reload namespace
n = dict()
#load imports
- for imp in self.get_imports():
- try: exec imp in n
+ for code in self.get_imports():
+ try: exec code in n
except: pass
+
+ for id, code in self.get_python_modules():
+ try:
+ module = imp.new_module(id)
+ exec code in module.__dict__
+ n[id] = module
+ except:
+ pass
+
#load parameters
np = dict()
for parameter in self.get_parameters():
diff --git a/grc/python/Generator.py b/grc/python/Generator.py
index ddd32ca355..d688beba15 100644
--- a/grc/python/Generator.py
+++ b/grc/python/Generator.py
@@ -181,10 +181,14 @@ class TopBlockGenerator(object):
blocks = filter(lambda b: b not in (imports + parameters), blocks)
for block in blocks:
- if block.get_key() == 'epy_block':
- file_path = os.path.join(self._dirname, block.get_id() + '.py')
+ key = block.get_key()
+ file_path = os.path.join(self._dirname, block.get_id() + '.py')
+ if key == 'epy_block':
src = block.get_param('_source_code').get_value()
output.append((file_path, src))
+ elif key == 'epy_module':
+ src = block.get_param('source_code').get_value()
+ output.append((file_path, src))
# Filter out virtual sink connections
cf = lambda c: not (c.is_bus() or c.is_msg() or c.get_sink().get_parent().is_virtual_sink())
diff --git a/grc/python/Param.py b/grc/python/Param.py
index 746f677e46..e60f613f00 100644
--- a/grc/python/Param.py
+++ b/grc/python/Param.py
@@ -31,7 +31,7 @@ from Constants import VECTOR_TYPES, COMPLEX_TYPES, REAL_TYPES, INT_TYPES
from gnuradio import eng_notation
_check_id_matcher = re.compile('^[a-z|A-Z]\w*$')
-_show_id_matcher = re.compile('^(variable\w*|parameter|options|notebook)$')
+_show_id_matcher = re.compile('^(variable\w*|parameter|options|notebook|epy_module)$')
#blacklist certain ids, its not complete, but should help