diff --git a/cmake/make_coverage.sh.in b/cmake/make_coverage.sh.in
index 8634e958b8845fec58ac88ab468c44dd2071c2d1..54642365d561e5181e780ccb3ec28f5e9dbfeb29 100755
--- a/cmake/make_coverage.sh.in
+++ b/cmake/make_coverage.sh.in
@@ -23,31 +23,81 @@
 #
 #######################################################################################################################
 
+TESTFILES=`find -name CTestTestfile.cmake`
+if [ -z "${TESTFILES}" ]; then
+  echo "No tests found. Not generating any coverage report."
+  exit 0
+fi
+
+#
+# Check whether Python tests are present
+#
+N_PYTHON=0
+for f in $TESTFILES; do
+  N_PYTHON=$(( N_PYTHON + `grep -E '^add_test\([^ ]* "/usr/bin/python3?" ' $f | wc -l` ))
+done
+
+#
+# Preparations for C++ coverage report
+#
 cmake --build . --target clean-gcda
+
+#
+# Preparations for Python coverage report
+#
+if (( N_PYTHON > 0 )); then
+  cp CTestTestfile.cmake CTestTestfile-backup.cmake
+  sed -E 's_"/usr/bin/python(3)?"_"/usr/bin/python\1-coverage" "run" "-a"_' -i CTestTestfile.cmake
+  python3-coverage erase
+fi
+
+#
+# Execute tests and record coverage data
+#
 cmake --build . --target test
-lcov --capture --directory . --output-file coverage_all.info --ignore-errors gcov
-
-#lcov capture also includes external stuff like glibc, boost etc.
-#only extract the reports for this project
-lcov --extract coverage_all.info "@CMAKE_SOURCE_DIR@*" -o coverage_only_source_tree.info
-
-#Some parts of the source code might be excluded. Set EXCLUDE_FROM_COVERAGE to contain 
-# a list of directories to be excluded from the coverage report.
-# Don't worry if this is empty. It just means there is nothing to exclude (the normal case).
-for exclude_dir in @EXCLUDE_FROM_COVERAGE@; do 
-    echo lcov --remove coverage_only_source_tree.info "@CMAKE_SOURCE_DIR@/${exclude_dir}*" -o tmp.info
-    lcov --remove coverage_only_source_tree.info "@CMAKE_SOURCE_DIR@/${exclude_dir}*" -o tmp.info
-    mv tmp.info coverage_only_source_tree.info
-done
 
-#Some projects install the library and its headers for testing in the build directory
-#and compile tests and examples against it. This leads to double
-#counting and untested lines in the coverage report. That's why we
-#exclude the build directory from the coverage report (needed if the
-#build directory is in the source tree).
-#Attention: If you make an 'in sorce build' the coverage report will
-#be empty!
-lcov --remove coverage_only_source_tree.info "@PROJECT_BINARY_DIR@/*" -o coverage.info
-
-#finally generate the html page
-genhtml coverage.info --output-directory coverage_html
+#
+# Check if C++ report has been generated
+#
+N_GCDA=`find -name *.gcda | wc -l`
+
+#
+# Generate C++ coverage report, if files have been found
+#
+if (( N_GCDA > 0 )); then
+  lcov --capture --directory . --output-file coverage_all.info --ignore-errors gcov
+
+  # lcov capture also includes external stuff like glibc, boost etc.
+  # only extract the reports for this project
+  lcov --extract coverage_all.info "@CMAKE_SOURCE_DIR@*" -o coverage_only_source_tree.info
+
+  # Some parts of the source code might be excluded. Set EXCLUDE_FROM_COVERAGE to contain 
+  # a list of directories to be excluded from the coverage report.
+  # Don't worry if this is empty. It just means there is nothing to exclude (the normal case).
+  for exclude_dir in @EXCLUDE_FROM_COVERAGE@; do 
+      echo lcov --remove coverage_only_source_tree.info "@CMAKE_SOURCE_DIR@/${exclude_dir}*" -o tmp.info
+      lcov --remove coverage_only_source_tree.info "@CMAKE_SOURCE_DIR@/${exclude_dir}*" -o tmp.info
+      mv tmp.info coverage_only_source_tree.info
+  done
+
+  # Some projects install the library and its headers for testing in the build directory
+  # and compile tests and examples against it. This leads to double
+  # counting and untested lines in the coverage report. That's why we
+  # exclude the build directory from the coverage report (needed if the
+  # build directory is in the source tree).
+  # Attention: If you make an 'in sorce build' the coverage report will
+  # be empty!
+  lcov --remove coverage_only_source_tree.info "@PROJECT_BINARY_DIR@/*" -o coverage.info
+
+  # finally generate the html page
+  genhtml coverage.info --output-directory coverage_html
+fi
+
+#
+# Generate Python coverage report
+#
+if (( N_PYTHON > 0 )); then
+  python3-coverage html --omit='/usr/lib/*' -d coverage_python_html
+  python3-coverage xml --omit='/usr/lib/*' -o coverage_python.xml
+  mv CTestTestfile-backup.cmake CTestTestfile.cmake
+fi