from PyQt5.QtXml import QDomDocument from qgis.core import QgsReadWriteContext def change_datasource(layer, target_uri): doc = QDomDocument("styles") element = doc.createElement("maplayer") layer.writeLayerXml(element, doc, QgsReadWriteContext()) element.elementsByTagName("datasource").item(0).firstChild().setNodeValue(target_uri.uri()) layer.readLayerXml(element, QgsReadWriteContext()) # layer.setDataSource(new_datasource, new_name, 'ogr')