diff --git a/src/python/grpcio/.gitignore b/src/python/grpcio/.gitignore
index 6f3d8673e7ac8612f1973a6e690f5df60bac82e6..95b96f7c1e9f7c368801e14f6848639f2b13485b 100644
--- a/src/python/grpcio/.gitignore
+++ b/src/python/grpcio/.gitignore
@@ -13,3 +13,4 @@ dist/
 nosetests.xml
 doc/
 _grpcio_metadata.py
+htmlcov/
diff --git a/src/python/grpcio/tox.ini b/src/python/grpcio/tox.ini
index 9acc4d65d81ef14a0edd78e502f680e83e2cd0c0..0e3cae7861bd176c1070fc722d503e862c0c4731 100644
--- a/src/python/grpcio/tox.ini
+++ b/src/python/grpcio/tox.ini
@@ -12,7 +12,8 @@ commands =
     {envpython} setup.py build_py
     {envpython} setup.py test
     coverage combine
-    coverage report --include='grpc/*' --omit='grpc/framework/alpha/*','grpc/early_adopter/*','grpc/framework/base/*','grpc/framework/face/*'
+    coverage html --include='grpc/*' --omit='grpc/framework/alpha/*','grpc/early_adopter/*','grpc/framework/base/*','grpc/framework/face/*','grpc/_adapter/fore.py','grpc/_adapter/rear.py'
+    coverage report --include='grpc/*' --omit='grpc/framework/alpha/*','grpc/early_adopter/*','grpc/framework/base/*','grpc/framework/face/*','grpc/_adapter/fore.py','grpc/_adapter/rear.py'
 deps =
     cython
     coverage
diff --git a/tools/run_tests/run_python.sh b/tools/run_tests/run_python.sh
index cc44a433bb181903e1ea1982723de15555d4d582..042b40485df68d0f6e73b3be776d5d1ca20c047a 100755
--- a/tools/run_tests/run_python.sh
+++ b/tools/run_tests/run_python.sh
@@ -46,3 +46,6 @@ export GRPC_PYTHON_ENABLE_CYTHON_TRACING=1
 cd $GRPCIO
 tox
 
+mkdir -p $ROOT/reports
+rm -rf $ROOT/reports/python-coverage
+(mv -T $GRPCIO/htmlcov $ROOT/reports/python-coverage) || true