You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by ma...@apache.org on 2021/01/18 21:20:57 UTC

[atlas] branch master updated (6edd4bc -> e06db7d)

This is an automated email from the ASF dual-hosted git repository.

madhan pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/atlas.git.


    from 6edd4bc  ATLAS-4101 : Fix http error code for JsonParseException by overriding readFrom method of JacksonJsonProvider.
     new 517bf28  ATLAS-4077: replaced print statements in Python files with call to print(), for Python3
     new e06db7d  ATLAS-4086: python client fixes - search APIs and others

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 distro/src/test/python/scripts/TestMetadata.py     |  4 +--
 intg/src/main/python/README.md                     |  5 ++--
 intg/src/main/python/apache_atlas/client/admin.py  |  5 +---
 .../main/python/apache_atlas/client/discovery.py   | 34 +++++++++++-----------
 intg/src/main/python/apache_atlas/client/entity.py |  4 +--
 .../main/python/apache_atlas/client/glossary.py    |  9 ++++--
 .../python/apache_atlas/client/relationship.py     |  2 +-
 .../src/main/python/apache_atlas/client/typedef.py |  1 +
 .../src/main/python/apache_atlas/model/glossary.py | 15 ++++------
 .../src/main/python/apache_atlas/model/instance.py | 15 +++++-----
 intg/src/main/python/setup.py                      |  2 +-
 .../src/main/resources/repair_index.py             |  8 ++---
 .../atlas_migration_export.py                      |  8 ++---
 13 files changed, 56 insertions(+), 56 deletions(-)


[atlas] 02/02: ATLAS-4086: python client fixes - search APIs and others

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

madhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/atlas.git

commit e06db7deaa4a013e7ee64ed52572f63b3f990037
Author: Verdan Mahmood <ve...@gmail.com>
AuthorDate: Mon Jan 18 13:15:40 2021 -0800

    ATLAS-4086: python client fixes - search APIs and others
    
    Signed-off-by: Madhan Neethiraj <ma...@apache.org>
---
 intg/src/main/python/README.md                     |  5 ++--
 intg/src/main/python/apache_atlas/client/admin.py  |  5 +---
 .../main/python/apache_atlas/client/discovery.py   | 34 +++++++++++-----------
 intg/src/main/python/apache_atlas/client/entity.py |  4 +--
 .../main/python/apache_atlas/client/glossary.py    |  9 ++++--
 .../python/apache_atlas/client/relationship.py     |  2 +-
 .../src/main/python/apache_atlas/client/typedef.py |  1 +
 .../src/main/python/apache_atlas/model/glossary.py | 15 ++++------
 .../src/main/python/apache_atlas/model/instance.py | 15 +++++-----
 intg/src/main/python/setup.py                      |  2 +-
 10 files changed, 46 insertions(+), 46 deletions(-)

diff --git a/intg/src/main/python/README.md b/intg/src/main/python/README.md
index a973717..5efc49a 100644
--- a/intg/src/main/python/README.md
+++ b/intg/src/main/python/README.md
@@ -16,7 +16,7 @@ Verify if apache-atlas client is installed:
 
 Package      Version
 ------------ ---------
-apache-atlas 0.0.3
+apache-atlas 0.0.4
 ```
 
 ## Usage
@@ -28,7 +28,8 @@ apache-atlas 0.0.3
 import time
 
 from apache_atlas.client.base_client import AtlasClient
-from apache_atlas.model.instance     import *
+from apache_atlas.model.instance     import AtlasEntity, AtlasEntityWithExtInfo, AtlasEntitiesWithExtInfo, AtlasRelatedObjectId
+from apache_atlas.model.enums        import EntityOperation
 
 
 ## Step 1: create a client to connect to Apache Atlas server
diff --git a/intg/src/main/python/apache_atlas/client/admin.py b/intg/src/main/python/apache_atlas/client/admin.py
index ebe72dc..e6a71b0 100644
--- a/intg/src/main/python/apache_atlas/client/admin.py
+++ b/intg/src/main/python/apache_atlas/client/admin.py
@@ -16,10 +16,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 from apache_atlas.model.admin import AtlasAdminMetrics
-from apache_atlas.utils import API
-from apache_atlas.utils import BASE_URI
-from apache_atlas.utils import HTTPMethod
-from apache_atlas.utils import HTTPStatus
+from apache_atlas.utils import API, BASE_URI, HTTPStatus, HTTPMethod
 
 
 class AdminClient:
diff --git a/intg/src/main/python/apache_atlas/client/discovery.py b/intg/src/main/python/apache_atlas/client/discovery.py
index 04f5fc9..b4fc0a8 100644
--- a/intg/src/main/python/apache_atlas/client/discovery.py
+++ b/intg/src/main/python/apache_atlas/client/discovery.py
@@ -15,14 +15,12 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-from apache_atlas.model.discovery import AtlasQuickSearchResult
-from apache_atlas.model.discovery import AtlasSearchResult
-from apache_atlas.model.discovery import AtlasSuggestionsResult
-from apache_atlas.model.discovery import AtlasUserSavedSearch
-from apache_atlas.utils import API
-from apache_atlas.utils import BASE_URI
-from apache_atlas.utils import HTTPMethod
-from apache_atlas.utils import HTTPStatus
+from apache_atlas.model.discovery import (AtlasQuickSearchResult, AtlasSearchResult,
+                                          AtlasSuggestionsResult, AtlasUserSavedSearch)
+from apache_atlas.utils import API, BASE_URI, HTTPMethod, HTTPStatus
+
+DEFAULT_LIMIT = 100
+DEFAULT_OFFSET = 0
 
 
 class DiscoveryClient:
@@ -66,7 +64,7 @@ class DiscoveryClient:
 
         return self.client.call_api(DiscoveryClient.DSL_SEARCH, AtlasSearchResult, query_params)
 
-    def dsl_search_with_params(self, query, limit, offset):
+    def dsl_search_with_params(self, query, limit=DEFAULT_LIMIT, offset=DEFAULT_OFFSET):
         query_params = {DiscoveryClient.QUERY: query, DiscoveryClient.LIMIT: limit, DiscoveryClient.OFFSET: offset}
 
         return self.client.call_api(DiscoveryClient.DSL_SEARCH, AtlasSearchResult, query_params)
@@ -76,29 +74,31 @@ class DiscoveryClient:
 
         return self.client.call_api(DiscoveryClient.FULL_TEXT_SEARCH, AtlasSearchResult, query_params)
 
-    def full_text_search_with_params(self, query, limit, offset):
+    def full_text_search_with_params(self, query, limit=DEFAULT_LIMIT, offset=DEFAULT_OFFSET):
         query_params = {DiscoveryClient.QUERY: query, DiscoveryClient.LIMIT: limit, DiscoveryClient.OFFSET: offset}
 
         return self.client.call_api(DiscoveryClient.FULL_TEXT_SEARCH, AtlasSearchResult, query_params)
 
-    def basic_search(self, type_name, classification, query, exclude_deleted_entities, limit, offset):
+    def basic_search(self, type_name, classification, query, exclude_deleted_entities,
+                     sort_by_attribute=None, sort_order=None,
+                     limit=DEFAULT_LIMIT, offset=DEFAULT_OFFSET):
         query_params = {"typeName": type_name, "classification": classification, DiscoveryClient.QUERY: query,
                         "excludeDeletedEntities": exclude_deleted_entities, DiscoveryClient.LIMIT: limit,
-                        DiscoveryClient.OFFSET: offset}
+                        DiscoveryClient.OFFSET: offset, "sortBy": sort_by_attribute, "sortOrder": sort_order}
 
         return self.client.call_api(DiscoveryClient.BASIC_SEARCH, AtlasSearchResult, query_params)
 
     def faceted_search(self, search_parameters):
-        return self.client.call_api(DiscoveryClient.FACETED_SEARCH, AtlasSearchResult, search_parameters)
+        return self.client.call_api(DiscoveryClient.FACETED_SEARCH, AtlasSearchResult, None, search_parameters)
 
-    def attribute_search(self, type_name, attr_name, attr_value_prefix, limit, offset):
+    def attribute_search(self, type_name, attr_name, attr_value_prefix, limit=DEFAULT_LIMIT, offset=DEFAULT_OFFSET):
         query_params = {"attrName": attr_name, "attrValuePrefix": attr_value_prefix, "typeName": type_name,
                         DiscoveryClient.LIMIT: limit, DiscoveryClient.OFFSET: offset}
 
         return self.client.call_api(DiscoveryClient.ATTRIBUTE_SEARCH, AtlasSearchResult, query_params)
 
-    def relationship_search(self, guid, relation, sort_by_attribute, sort_order, exclude_deleted_entities, limit,
-                            offset):
+    def relationship_search(self, guid, relation, sort_by_attribute, sort_order, exclude_deleted_entities,
+                            limit=DEFAULT_LIMIT, offset=DEFAULT_OFFSET):
         query_params = {"guid": guid, "relation": relation, "sortBy": sort_by_attribute,
                         "excludeDeletedEntities": exclude_deleted_entities,
                         DiscoveryClient.LIMIT: limit, DiscoveryClient.OFFSET: offset}
@@ -108,7 +108,7 @@ class DiscoveryClient:
 
         return self.client.call_api(DiscoveryClient.RELATIONSHIP_SEARCH, AtlasSearchResult, query_params)
 
-    def quick_search(self, query, type_name, exclude_deleted_entities, limit, offset):
+    def quick_search(self, query, type_name, exclude_deleted_entities, limit=DEFAULT_LIMIT, offset=DEFAULT_OFFSET):
         query_params = {"query": query, "typeName": type_name, "excludeDeletedEntities": exclude_deleted_entities,
                         DiscoveryClient.LIMIT: limit, DiscoveryClient.OFFSET: offset}
 
diff --git a/intg/src/main/python/apache_atlas/client/entity.py b/intg/src/main/python/apache_atlas/client/entity.py
index 7edacf9..f48ab7d 100644
--- a/intg/src/main/python/apache_atlas/client/entity.py
+++ b/intg/src/main/python/apache_atlas/client/entity.py
@@ -170,11 +170,11 @@ class EntityClient:
         return self.client.call_api(EntityClient.UPDATE_ENTITY, EntityMutationResponse, None, atlas_entities)
 
     def partial_update_entity_by_guid(self, entity_guid, attr_value, attr_name):
-        query_params = {"name", attr_name}
+        query_params = {"name": attr_name}
 
         return self.client.call_api(
             EntityClient.PARTIAL_UPDATE_ENTITY_BY_GUID.format_path({'entity_guid': entity_guid}),
-            EntityMutationResponse, attr_value, query_params)
+            EntityMutationResponse, query_params, attr_value)
 
     def delete_entity_by_guid(self, guid):
         return self.client.call_api(EntityClient.DELETE_ENTITY_BY_GUID.format_path_with_params(guid),
diff --git a/intg/src/main/python/apache_atlas/client/glossary.py b/intg/src/main/python/apache_atlas/client/glossary.py
index efa0612..0399c7c 100644
--- a/intg/src/main/python/apache_atlas/client/glossary.py
+++ b/intg/src/main/python/apache_atlas/client/glossary.py
@@ -86,10 +86,14 @@ class GlossaryClient:
     OFFSET = "offset"
     STATUS = "Status"
 
+    DEFAULT_LIMIT = -1
+    DEFAULT_OFFSET = 0
+    DEFAULT_SORT = "ASC"
+
     def __init__(self, client):
         self.client = client
 
-    def get_all_glossaries(self, sort_by_attribute, limit, offset):
+    def get_all_glossaries(self, sort_by_attribute=DEFAULT_SORT, limit=DEFAULT_LIMIT, offset=DEFAULT_OFFSET):
         query_params = {"sort": sort_by_attribute, GlossaryClient.LIMIT: limit, GlossaryClient.OFFSET: offset}
 
         return self.client.call_api(GlossaryClient.GET_ALL_GLOSSARIES, list, query_params)
@@ -106,7 +110,8 @@ class GlossaryClient:
         return self.client.call_api(GlossaryClient.GET_GLOSSARY_TERM.format_path_with_params(term_guid),
                                     AtlasGlossaryTerm)
 
-    def get_glossary_terms(self, glossary_guid, sort_by_attribute, limit, offset):
+    def get_glossary_terms(self, glossary_guid, sort_by_attribute=DEFAULT_SORT,
+                           limit=DEFAULT_LIMIT, offset=DEFAULT_OFFSET):
         query_params = {"glossaryGuid": glossary_guid, GlossaryClient.LIMIT: limit, GlossaryClient.OFFSET: offset,
                         "sort": sort_by_attribute}
 
diff --git a/intg/src/main/python/apache_atlas/client/relationship.py b/intg/src/main/python/apache_atlas/client/relationship.py
index f5790a4..112ec33 100644
--- a/intg/src/main/python/apache_atlas/client/relationship.py
+++ b/intg/src/main/python/apache_atlas/client/relationship.py
@@ -47,7 +47,7 @@ class RelationshipClient:
                                     AtlasRelationshipWithExtInfo, query_params)
 
     def create_relationship(self, relationship):
-        return self.client.call_api(RelationshipClient.CREATE_RELATIONSHIP, AtlasRelationship, relationship)
+        return self.client.call_api(RelationshipClient.CREATE_RELATIONSHIP, AtlasRelationship, None, relationship)
 
     def update_relationship(self, relationship):
         return self.client.call_api(RelationshipClient.UPDATE_RELATIONSHIP, AtlasRelationship, relationship)
diff --git a/intg/src/main/python/apache_atlas/client/typedef.py b/intg/src/main/python/apache_atlas/client/typedef.py
index aa1581d..4ccfb60 100644
--- a/intg/src/main/python/apache_atlas/client/typedef.py
+++ b/intg/src/main/python/apache_atlas/client/typedef.py
@@ -40,6 +40,7 @@ class TypeDefClient:
     GET_TYPEDEF_BY_GUID = API(TYPEDEF_BY_GUID, HTTPMethod.GET, HTTPStatus.OK)
     GET_ALL_TYPE_DEFS = API(TYPEDEFS_API, HTTPMethod.GET, HTTPStatus.OK)
     GET_ALL_TYPE_DEF_HEADERS = API(TYPEDEFS_API + "headers", HTTPMethod.GET, HTTPStatus.OK)
+    UPDATE_TYPE_DEFS = API(TYPEDEFS_API, HTTPMethod.PUT, HTTPStatus.OK)
     CREATE_TYPE_DEFS = API(TYPEDEFS_API, HTTPMethod.POST, HTTPStatus.OK)
     DELETE_TYPE_DEFS = API(TYPEDEFS_API, HTTPMethod.DELETE, HTTPStatus.NO_CONTENT)
     DELETE_TYPE_DEF_BY_NAME = API(TYPEDEF_BY_NAME, HTTPMethod.DELETE, HTTPStatus.NO_CONTENT)
diff --git a/intg/src/main/python/apache_atlas/model/glossary.py b/intg/src/main/python/apache_atlas/model/glossary.py
index 7a0faac..2afc168 100644
--- a/intg/src/main/python/apache_atlas/model/glossary.py
+++ b/intg/src/main/python/apache_atlas/model/glossary.py
@@ -15,13 +15,10 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-from apache_atlas.model.instance import AtlasBase
-from apache_atlas.model.instance import AtlasClassification
-from apache_atlas.model.instance import AtlasRelatedObjectId
-from apache_atlas.model.misc import AtlasBaseModelObject
-from apache_atlas.utils import type_coerce
-from apache_atlas.utils import type_coerce_dict
-from apache_atlas.utils import type_coerce_list
+# This is to avoid the circular dependencies that instance.py and glossary.py has.
+import apache_atlas.model.instance as instance
+from apache_atlas.model.misc import AtlasBase, AtlasBaseModelObject
+from apache_atlas.utils import type_coerce, type_coerce_dict, type_coerce_list
 
 
 class AtlasGlossaryBaseObject(AtlasBaseModelObject):
@@ -38,7 +35,7 @@ class AtlasGlossaryBaseObject(AtlasBaseModelObject):
     def type_coerce_attrs(self):
         super(AtlasGlossaryBaseObject, self).type_coerce_attrs()
 
-        self.classifications = type_coerce_list(self.classifications, AtlasClassification)
+        self.classifications = type_coerce_list(self.classifications, instance.AtlasClassification)
 
 
 class AtlasGlossary(AtlasGlossaryBaseObject):
@@ -141,7 +138,7 @@ class AtlasGlossaryTerm(AtlasGlossaryBaseObject):
         super(AtlasGlossaryTerm, self).type_coerce_attrs()
 
         self.anchor = type_coerce(self.anchor, AtlasGlossaryHeader)
-        self.assignedEntities = type_coerce_list(self.assignedEntities, AtlasRelatedObjectId)
+        self.assignedEntities = type_coerce_list(self.assignedEntities, instance.AtlasRelatedObjectId)
         self.categories = type_coerce_list(self.categories, AtlasTermCategorizationHeader)
         self.seeAlso = type_coerce_list(self.seeAlso, AtlasRelatedTermHeader)
         self.synonyms = type_coerce_list(self.synonyms, AtlasRelatedTermHeader)
diff --git a/intg/src/main/python/apache_atlas/model/instance.py b/intg/src/main/python/apache_atlas/model/instance.py
index 8cfb254..3b2edc4 100644
--- a/intg/src/main/python/apache_atlas/model/instance.py
+++ b/intg/src/main/python/apache_atlas/model/instance.py
@@ -15,11 +15,10 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-import apache_atlas
-
-from apache_atlas.model.enums import *
-from apache_atlas.model.misc import *
-from apache_atlas.utils import *
+from apache_atlas.model.enums import EntityStatus
+from apache_atlas.model.glossary import AtlasTermAssignmentHeader
+from apache_atlas.model.misc import AtlasBase, next_id, Plist, TimeBoundary
+from apache_atlas.utils import non_null, type_coerce, type_coerce_dict, type_coerce_dict_list, type_coerce_list
 
 
 class AtlasStruct(AtlasBase):
@@ -62,7 +61,7 @@ class AtlasEntity(AtlasStruct):
         super(AtlasEntity, self).type_coerce_attrs()
 
         self.classifications = type_coerce_list(self.classifications, AtlasClassification)
-        self.meanings = type_coerce_list(self.meanings, apache_atlas.model.glossary.AtlasTermAssignmentHeader)
+        self.meanings = type_coerce_list(self.meanings, AtlasTermAssignmentHeader)
 
     def get_relationship_attribute(self, name):
         return self.relationshipAttributes[
@@ -122,7 +121,7 @@ class AtlasEntitiesWithExtInfo(AtlasEntityExtInfo):
     def type_coerce_attrs(self):
         super(AtlasEntitiesWithExtInfo, self).type_coerce_attrs()
 
-        self.entities = type_coerce_list(self.entity, AtlasEntity)
+        self.entities = type_coerce_list(self.entities, AtlasEntity)
 
     def add_entity(self, entity):
         if self.entities is None:
@@ -152,7 +151,7 @@ class AtlasEntityHeader(AtlasStruct):
         super(AtlasEntityHeader, self).type_coerce_attrs()
 
         self.classifications = type_coerce_list(self.classifications, AtlasClassification)
-        self.meanings = type_coerce_list(self.meanings, apache_atlas.model.glossary.AtlasTermAssignmentHeader)
+        self.meanings = type_coerce_list(self.meanings, AtlasTermAssignmentHeader)
 
 
 class AtlasClassification(AtlasStruct):
diff --git a/intg/src/main/python/setup.py b/intg/src/main/python/setup.py
index 7c563c9..59c7327 100644
--- a/intg/src/main/python/setup.py
+++ b/intg/src/main/python/setup.py
@@ -28,7 +28,7 @@ with open("README.md", "r") as fh:
 
 setup(
     name='apache-atlas',
-    version='0.0.3',
+    version='0.0.4',
     author="Apache Atlas",
     author_email='dev@atlas.apache.org',
     description="Apache Atlas Python Client",


[atlas] 01/02: ATLAS-4077: replaced print statements in Python files with call to print(), for Python3

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

madhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/atlas.git

commit 517bf28489ebbf44dc39acbac972b30bb02043ba
Author: Madhan Neethiraj <ma...@apache.org>
AuthorDate: Fri Jan 15 16:52:59 2021 -0800

    ATLAS-4077: replaced print statements in Python files with call to print(), for Python3
---
 distro/src/test/python/scripts/TestMetadata.py              | 4 ++--
 tools/atlas-index-repair/src/main/resources/repair_index.py | 8 ++++----
 tools/atlas-migration-exporter/atlas_migration_export.py    | 8 ++++----
 3 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/distro/src/test/python/scripts/TestMetadata.py b/distro/src/test/python/scripts/TestMetadata.py
index 251de93..662fbdd 100644
--- a/distro/src/test/python/scripts/TestMetadata.py
+++ b/distro/src/test/python/scripts/TestMetadata.py
@@ -43,12 +43,12 @@ class TestMetadata(unittest.TestCase):
 
     # The getConfig mock has to be configured here to return the expected mock values
     def get_config_mock_side_effect(*args, **kwargs):
-        print "get_config_mock_side_effect (" + args[2] + ")"
+        print("get_config_mock_side_effect (" + args[2] + ")")
         return TestMetadata.mock_values.get(args[2])
 
     # The getConfig mock has to be configured here to return the expected mock values
     def get_default_config_mock_side_effect(*args, **kwargs):
-        print "get_default_config_mock_side_effect (" + args[3] + ")"
+        print("get_default_config_mock_side_effect (" + args[3] + ")")
         return TestMetadata.mock_values.get(args[3])
 
     @patch.object(mc, "runProcess")
diff --git a/tools/atlas-index-repair/src/main/resources/repair_index.py b/tools/atlas-index-repair/src/main/resources/repair_index.py
index bbdc854..0333dad 100755
--- a/tools/atlas-index-repair/src/main/resources/repair_index.py
+++ b/tools/atlas-index-repair/src/main/resources/repair_index.py
@@ -106,10 +106,10 @@ def main():
 
 
     if is_hbase and mc.is_hbase_local(confdir):
-        print "configured for local hbase."
+        print("configured for local hbase.")
         mc.configure_hbase(atlas_home)
         mc.run_hbase_action(mc.hbaseBinDir(atlas_home), "start", hbase_conf_dir, logdir)
-        print "hbase started."
+        print("hbase started.")
 
     web_app_path = os.path.join(web_app_dir, "atlas")
     if (mc.isCygwin()):
@@ -146,8 +146,8 @@ if __name__ == '__main__':
     try:
         returncode = main()
     except Exception as e:
-        print "Exception: %s " % str(e)
-        print traceback.format_exc()
+        print("Exception: %s " % str(e))
+        print(traceback.format_exc())
         returncode = -1
 
     sys.exit(returncode)
diff --git a/tools/atlas-migration-exporter/atlas_migration_export.py b/tools/atlas-migration-exporter/atlas_migration_export.py
index 591043f..e1b12f6 100755
--- a/tools/atlas-migration-exporter/atlas_migration_export.py
+++ b/tools/atlas-migration-exporter/atlas_migration_export.py
@@ -107,10 +107,10 @@ def main():
            mc.server_pid_not_running(pid)
 
     if is_hbase and mc.is_hbase_local(confdir):
-        print "configured for local hbase."
+        print("configured for local hbase.")
         mc.configure_hbase(atlas_home)
         mc.run_hbase_action(mc.hbaseBinDir(atlas_home), "start", hbase_conf_dir, logdir)
-        print "hbase started."
+        print("hbase started.")
 
     web_app_path = os.path.join(web_app_dir, "atlas")
     if (mc.isCygwin()):
@@ -147,8 +147,8 @@ if __name__ == '__main__':
     try:
         returncode = main()
     except Exception as e:
-        print "Exception: %s " % str(e)
-        print traceback.format_exc()
+        print("Exception: %s " % str(e))
+        print(traceback.format_exc())
         returncode = -1
 
     sys.exit(returncode)