mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-07-06 04:10:35 +08:00
9a96ca14be
The problem with printing the exception was that starting with
Python 3.6 the ImportError is yet another (sub) exception called
ModuleNotFoundError which can't be printed as a string and then triggers
another exception:
```
Traceback (most recent call last):
File "/home/julianoes/src/Firmware/Tools/serial/generate_config.py", line 11, in <module>
import jinja2
ModuleNotFoundError: No module named 'jinja2'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/julianoes/src/Firmware/Tools/serial/generate_config.py", line 13, in <module>
print("Failed to import jinja2: " + e)
TypeError: must be str, not ModuleNotFoundError
```
As per @bkueng's suggestion the easiest is to cast the exception to str
and that way prevent the second exception.
71 lines
2.0 KiB
Python
Executable File
71 lines
2.0 KiB
Python
Executable File
#!/usr/bin/env python
|
|
"""
|
|
Param source code generation script.
|
|
"""
|
|
from __future__ import print_function
|
|
import xml.etree.ElementTree as ET
|
|
import codecs
|
|
import argparse
|
|
import sys
|
|
|
|
try:
|
|
from jinja2 import Environment, FileSystemLoader
|
|
except ImportError as e:
|
|
print("Failed to import jinja2: " + str(e))
|
|
print("")
|
|
print("You may need to install it using:")
|
|
print(" pip3 install --user jinja2")
|
|
print("")
|
|
sys.exit(1)
|
|
|
|
import os
|
|
|
|
def generate(xml_file, dest='.'):
|
|
"""
|
|
Generate px4 param source from xml.
|
|
|
|
@param xml_file: input parameter xml file
|
|
@param dest: Destination directory for generated files
|
|
None means to scan everything.
|
|
"""
|
|
# pylint: disable=broad-except
|
|
tree = ET.parse(xml_file)
|
|
root = tree.getroot()
|
|
|
|
params = []
|
|
for group in root:
|
|
if group.tag == "group" and "no_code_generation" not in group.attrib:
|
|
for param in group:
|
|
params.append(param)
|
|
|
|
params = sorted(params, key=lambda name: name.attrib["name"])
|
|
|
|
script_path = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
# for jinja docs see: http://jinja.pocoo.org/docs/2.9/api/
|
|
env = Environment(
|
|
loader=FileSystemLoader(os.path.join(script_path, 'templates')))
|
|
|
|
if not os.path.isdir(dest):
|
|
os.path.mkdir(dest)
|
|
|
|
template_files = [
|
|
'px4_parameters.h.jinja',
|
|
'px4_parameters_public.h.jinja',
|
|
'px4_parameters.c.jinja',
|
|
]
|
|
for template_file in template_files:
|
|
template = env.get_template(template_file)
|
|
with open(os.path.join(
|
|
dest, template_file.replace('.jinja','')), 'w') as fid:
|
|
fid.write(template.render(params=params))
|
|
|
|
if __name__ == "__main__":
|
|
arg_parser = argparse.ArgumentParser()
|
|
arg_parser.add_argument("--xml", help="parameter xml file")
|
|
arg_parser.add_argument("--dest", help="destination path", default=os.path.curdir)
|
|
args = arg_parser.parse_args()
|
|
generate(xml_file=args.xml, dest=args.dest)
|
|
|
|
# vim: set et fenc=utf-8 ff=unix sts=4 sw=4 ts=4 :
|