diff --git a/pyinventorymgr/inventory_items.py b/pyinventorymgr/inventory_items.py
index 168e3d6..1c0a5f7 100644
--- a/pyinventorymgr/inventory_items.py
+++ b/pyinventorymgr/inventory_items.py
@@ -2,6 +2,7 @@
 
 import os
 import sys
+
 # TODO: openbmc/openbmc#2994 remove python 2 support
 try:  # python 2
     import gobject
@@ -14,81 +15,76 @@
 from obmc.dbuslib.bindings import get_dbus, DbusProperties, DbusObjectManager
 
 
-INTF_NAME = 'org.openbmc.InventoryItem'
-DBUS_NAME = 'org.openbmc.Inventory'
+INTF_NAME = "org.openbmc.InventoryItem"
+DBUS_NAME = "org.openbmc.Inventory"
 
 FRUS = {}
 
 
 class Inventory(DbusProperties, DbusObjectManager):
     def __init__(self, bus, name):
-        super(Inventory, self).__init__(
-            conn=bus,
-            object_path=name)
+        super(Inventory, self).__init__(conn=bus, object_path=name)
 
 
 class InventoryItem(DbusProperties):
     def __init__(self, bus, name, data):
-        super(InventoryItem, self).__init__(
-            conn=bus,
-            object_path=name)
+        super(InventoryItem, self).__init__(conn=bus, object_path=name)
 
         self.name = name
 
-        if 'present' not in data:
-            data['present'] = 'False'
-        if 'fault' not in data:
-            data['fault'] = 'False'
-        if 'version' not in data:
-            data['version'] = ''
+        if "present" not in data:
+            data["present"] = "False"
+        if "fault" not in data:
+            data["fault"] = "False"
+        if "version" not in data:
+            data["version"] = ""
 
         self.SetMultiple(INTF_NAME, data)
 
         # this will load properties from cache
         PropertyCacher.load(name, INTF_NAME, self.properties)
 
-    @dbus.service.method(
-        INTF_NAME, in_signature='a{sv}', out_signature='')
+    @dbus.service.method(INTF_NAME, in_signature="a{sv}", out_signature="")
     def update(self, data):
         self.SetMultiple(INTF_NAME, data)
         PropertyCacher.save(self.name, INTF_NAME, self.properties)
 
-    @dbus.service.method(
-        INTF_NAME, in_signature='s', out_signature='')
+    @dbus.service.method(INTF_NAME, in_signature="s", out_signature="")
     def setPresent(self, present):
-        self.Set(INTF_NAME, 'present', present)
+        self.Set(INTF_NAME, "present", present)
         PropertyCacher.save(self.name, INTF_NAME, self.properties)
 
-    @dbus.service.method(
-        INTF_NAME, in_signature='s', out_signature='')
+    @dbus.service.method(INTF_NAME, in_signature="s", out_signature="")
     def setFault(self, fault):
-        self.Set(INTF_NAME, 'fault', fault)
+        self.Set(INTF_NAME, "fault", fault)
         PropertyCacher.save(self.name, INTF_NAME, self.properties)
 
 
 def getVersion():
     version = "Error"
-    with open('/etc/os-release', 'r') as f:
+    with open("/etc/os-release", "r") as f:
         for line in f:
-            p = line.rstrip('\n')
-            parts = line.rstrip('\n').split('=')
-            if (parts[0] == "VERSION_ID"):
+            p = line.rstrip("\n")
+            parts = line.rstrip("\n").split("=")
+            if parts[0] == "VERSION_ID":
                 version = parts[1]
                 version = version.strip('"')
     return version
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
     bus = get_dbus()
     mainloop = gobject.MainLoop()
-    obj_parent = Inventory(bus, '/org/openbmc/inventory')
-    INVENTORY_FILE = os.path.join(sys.prefix, 'share',
-                                  'inventory', 'inventory.json')
+    obj_parent = Inventory(bus, "/org/openbmc/inventory")
+    INVENTORY_FILE = os.path.join(
+        sys.prefix, "share", "inventory", "inventory.json"
+    )
 
     if os.path.exists(INVENTORY_FILE):
         import json
-        with open(INVENTORY_FILE, 'r') as f:
+
+        with open(INVENTORY_FILE, "r") as f:
             try:
                 inv = json.load(f)
             except ValueError:
@@ -98,21 +94,23 @@
     else:
         try:
             import obmc_system_config as System
+
             FRUS = System.FRU_INSTANCES
         except ImportError:
             pass
 
     for f in list(FRUS.keys()):
         import obmc.inventory
+
         obj_path = f.replace("<inventory_root>", obmc.inventory.INVENTORY_ROOT)
         obj = InventoryItem(bus, obj_path, FRUS[f])
         obj_parent.add(obj_path, obj)
 
         # TODO:  this is a hack to update bmc inventory item with version
         # should be done by flash object
-        if (FRUS[f]['fru_type'] == "BMC"):
+        if FRUS[f]["fru_type"] == "BMC":
             version = getVersion()
-            obj.update({'version': version})
+            obj.update({"version": version})
 
     obj_parent.unmask_signals()
     name = dbus.service.BusName(DBUS_NAME, bus)
diff --git a/pyinventorymgr/obmc/inventory/__init__.py b/pyinventorymgr/obmc/inventory/__init__.py
index e9a1f83..90ae277 100644
--- a/pyinventorymgr/obmc/inventory/__init__.py
+++ b/pyinventorymgr/obmc/inventory/__init__.py
@@ -1 +1 @@
-INVENTORY_ROOT = '/org/openbmc/inventory'
+INVENTORY_ROOT = "/org/openbmc/inventory"
diff --git a/pyinventorymgr/setup.py b/pyinventorymgr/setup.py
index 6493ccb..bb068c0 100644
--- a/pyinventorymgr/setup.py
+++ b/pyinventorymgr/setup.py
@@ -1,7 +1,8 @@
 from distutils.core import setup
 
-setup(name='pyinventorymgr',
-      version='1.0',
-      packages=['obmc.inventory'],
-      scripts=['sync_inventory_items.py'],
-      )
+setup(
+    name="pyinventorymgr",
+    version="1.0",
+    packages=["obmc.inventory"],
+    scripts=["sync_inventory_items.py"],
+)
diff --git a/pyinventorymgr/sync_inventory_items.py b/pyinventorymgr/sync_inventory_items.py
index a96c015..7a5635a 100644
--- a/pyinventorymgr/sync_inventory_items.py
+++ b/pyinventorymgr/sync_inventory_items.py
@@ -24,17 +24,17 @@
 import obmc.mapper
 import shutil
 
-INV_INTF_NAME = 'xyz.openbmc_project.Inventory.Item.NetworkInterface'
-NET_DBUS_NAME = 'org.openbmc.NetworkManager'
-NET_OBJ_NAME = '/org/openbmc/NetworkManager/Interface'
-CHS_DBUS_NAME = 'org.openbmc.control.Chassis'
-CHS_INTF_NAME = 'xyz.openbmc_project.Common.UUID'
-CHS_OBJ_NAME = '/org/openbmc/control/chassis0'
-PROP_INTF_NAME = 'org.freedesktop.DBus.Properties'
-INVENTORY_ROOT = '/xyz/openbmc_project/inventory'
-NETWORK_ROOT = '/xyz/openbmc_project/network'
-ETHERNET_INTF_NAME = 'xyz.openbmc_project.Network.EthernetInterface'
-MAC_INTF_NAME = 'xyz.openbmc_project.Network.MACAddress'
+INV_INTF_NAME = "xyz.openbmc_project.Inventory.Item.NetworkInterface"
+NET_DBUS_NAME = "org.openbmc.NetworkManager"
+NET_OBJ_NAME = "/org/openbmc/NetworkManager/Interface"
+CHS_DBUS_NAME = "org.openbmc.control.Chassis"
+CHS_INTF_NAME = "xyz.openbmc_project.Common.UUID"
+CHS_OBJ_NAME = "/org/openbmc/control/chassis0"
+PROP_INTF_NAME = "org.freedesktop.DBus.Properties"
+INVENTORY_ROOT = "/xyz/openbmc_project/inventory"
+NETWORK_ROOT = "/xyz/openbmc_project/network"
+ETHERNET_INTF_NAME = "xyz.openbmc_project.Network.EthernetInterface"
+MAC_INTF_NAME = "xyz.openbmc_project.Network.MACAddress"
 
 FRUS = {}
 
@@ -50,26 +50,25 @@
 
     # Get the inventory subtree, limited
     # to objects that implement NetworkInterface.
-    for path, info in \
-        mapper.get_subtree(
-            path=INVENTORY_ROOT,
-            interfaces=[INV_INTF_NAME]).iteritems():
+    for path, info in mapper.get_subtree(
+        path=INVENTORY_ROOT, interfaces=[INV_INTF_NAME]
+    ).iteritems():
 
-            # Find a NetworkInterface with 'bmc' in the path.
-            if 'bmc' not in path:
-                continue
+        # Find a NetworkInterface with 'bmc' in the path.
+        if "bmc" not in path:
+            continue
 
-            # Only expecting a single service to implement
-            # NetworkInterface.  Get the service connection
-            # from the mapper response
-            conn = info.keys()[0]
+        # Only expecting a single service to implement
+        # NetworkInterface.  Get the service connection
+        # from the mapper response
+        conn = info.keys()[0]
 
-            # Get the inventory object implementing NetworkInterface.
-            obj = bus.get_object(conn, path)
+        # Get the inventory object implementing NetworkInterface.
+        obj = bus.get_object(conn, path)
 
-            # Get the MAC address
-            mproxy = obj.get_dbus_method('Get', PROP_INTF_NAME)
-            return mproxy(INV_INTF_NAME, prop)
+        # Get the MAC address
+        mproxy = obj.get_dbus_method("Get", PROP_INTF_NAME)
+        return mproxy(INV_INTF_NAME, prop)
 
 
 # Get Network Interface object.
@@ -78,15 +77,14 @@
 
     # Get the network subtree, limited
     # to objects that implements EthernetInterface.
-    for path, info in \
-        mapper.get_subtree(
-            path=NETWORK_ROOT,
-            interfaces=[ETHERNET_INTF_NAME]).iteritems():
+    for path, info in mapper.get_subtree(
+        path=NETWORK_ROOT, interfaces=[ETHERNET_INTF_NAME]
+    ).iteritems():
 
         # Find the one which is having physical interface,it may happen
         # that vlan interface is there and we want the physical
         # interface here.
-        if path.split('/')[-1].find('_') < 0:
+        if path.split("/")[-1].find("_") < 0:
             service = info.keys()[0]
             net_obj = bus.get_object(service, path)
             return net_obj
@@ -98,9 +96,7 @@
 
     # Get the inventory subtree, limited
     # to objects that implement UUID.
-    resp = mapper.get_subtree(
-        path=INVENTORY_ROOT,
-        interfaces=[CHS_INTF_NAME])
+    resp = mapper.get_subtree(path=INVENTORY_ROOT, interfaces=[CHS_INTF_NAME])
 
     # Only expecting a single object to implement UUID.
     try:
@@ -117,13 +113,13 @@
     obj = bus.get_object(conn, path)
 
     # Get the uuid
-    mproxy = obj.get_dbus_method('Get', PROP_INTF_NAME)
+    mproxy = obj.get_dbus_method("Get", PROP_INTF_NAME)
     return mproxy(CHS_INTF_NAME, prop)
 
 
 # Get the value of the mac on the system (from u-boot) without ':' separators
 def get_sys_mac(obj):
-    sys_mac = ''
+    sys_mac = ""
     try:
         sys_mac = subprocess.check_output(["fw_printenv", "-n", "ethaddr"])
     except Exception:
@@ -153,18 +149,18 @@
 def set_sys_uuid(uuid):
     rc = subprocess.call(["fw_setenv", "uuid", uuid])
     if rc == 0:
-        print "Rebooting BMC to set uuid"
+        print("Rebooting BMC to set uuid")
         # TODO Uncomment once sync from u-boot to /etc/machine-id is in place
         # Issue openbmc/openbmc#479
         # rc = subprocess.call(["reboot"])
     else:
-        print "Error setting uuid"
+        print("Error setting uuid")
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     arg = argparse.ArgumentParser()
-    arg.add_argument('-p')
-    arg.add_argument('-s')
+    arg.add_argument("-p")
+    arg.add_argument("-s")
 
     opt = arg.parse_args()
     prop_name = opt.p
@@ -177,19 +173,19 @@
             sys.exit(1)
         net_obj = get_network_interface_object(bus)
         if not net_obj:
-            print "Unable to get the network object"
+            print("Unable to get the network object")
             sys.exit(1)
         sys_mac = get_sys_mac(net_obj)
         if inv_mac != sys_mac:
-            print "Inventory MAC=%s,System MAC=%s" % (inv_mac, sys_mac)
+            print("Inventory MAC=%s,System MAC=%s" % (inv_mac, sys_mac))
             sync_mac(net_obj, inv_mac, sys_mac)
     elif sync_type == "uuid":
-            inv_uuid = get_uuid(bus, prop_name)
-            if inv_uuid:
-                inv_uuid = uuid.UUID(inv_uuid)
-                chs_obj = bus.get_object(CHS_DBUS_NAME, CHS_OBJ_NAME)
-                chs_uuid = get_sys_uuid(chs_obj)
-                if inv_uuid != sys_uuid:
-                    set_sys_uuid(inv_uuid)
+        inv_uuid = get_uuid(bus, prop_name)
+        if inv_uuid:
+            inv_uuid = uuid.UUID(inv_uuid)
+            chs_obj = bus.get_object(CHS_DBUS_NAME, CHS_OBJ_NAME)
+            chs_uuid = get_sys_uuid(chs_obj)
+            if inv_uuid != sys_uuid:
+                set_sys_uuid(inv_uuid)
 
 # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4
