[QGIS-it-user] deleteShapefile in pyqgis

Buongiorno a tutti,

noto un comportamento strano in pyqgis nell’usare la funzione
QgsVectorFileWriter.deleteShapeFile(file_path)

di seguito il codice molto semplice che uso:

def removeLayer(path_layer):
    # remove layer from TOC if already loaded
    basefile = os.path.basename(path_layer)
    diff_layer = os.path.splitext(basefile)[0]
    directory = os.path.dirname(path_layer)
    extensions = ["shp", "shx", "dbf", "prj", "sbn", "sbx", "fbn", "fbx", "ain", "aih", "ixs", "mxs", "atx", "xml",
                  "cpg", "qix"]
    output_path=path_layer
    if os.path.exists(path_layer):
        if len(QgsProject.instance().mapLayersByName(diff_layer)) > 0:
            lyr = QgsProject.instance().mapLayersByName(diff_layer)[0]
            print('renaming layer1: ', [lyr.id](http://lyr.id)())
            QgsProject.instance().removeMapLayer([lyr.id](http://lyr.id)())

        QgsVectorFileWriter.deleteShapeFile(path_layer)

In sostanze se mando l’ultima riga dalla console python di QGIS cancello correttamente lo shapefile. Internamente al mio codice rimane in cartella il file .shp e .dbf che non vengono cancellati generandomi errori nella parte seguente.

Qualcuno saprebbe dirmi dove sto sbagliando?
Grazie
P

···

Ing. Pierluigi De Rosa (PhD in Earth Science)
Contract Professor of Geographic Information System at University of Perugia
cel: 3497558268 / fax: 075 7823038
skype: pierluigi.derosa

Ciao Pierluigi,
QgsVectorFileWriter.deleteShapeFile() può cancellare solo i file dello Shapefile che non sono utilizzati da alcun processo.

QgsProject.instance().removeMapLayer(), quando utilizzato in uno script Python, non rilascia tutti gli handle del processo qgis.exe dei due file *.shp e *.dbf che quindi il sistema operativo considera ancora utilizzati e non permette di cancellarli.
Gli handle vengono rilasciati solo alla fine dell'esecuzione dello script.
Il problema dovrebbe dipendere dal fatto che l'uso di QgsProject.instance() non è thread-safe.
Se stai sviluppando un algoritmo di processing, potresti provare a dichiararlo come QgsProcessingAlgorithm.FlagNoThreading

Se fai una ricerca in Internet con un motore di ricerca ti accorgerai che si sono varie pagine su gis.stackexchange.com relative a questo problema, oltre ad un paio di bug report nel repository GitHub di QGIS.

Se riesci a trovare una soluzione... facci sapere! Altrimenti forse potresti sollevare la questione chiedendo chiarimenti nella mailing list qgis-developer (nella quale pure è già stata in passato affrontata senza risolverla).

A presto.

Andrea Giudiceandrea

Grazie Andrea della risposta.
Era quello che pensavo.

Al momento non ho ancora trovato una soluzione valida.
P

Il Gio 27 Gen 2022, 21:45 Andrea Giudiceandrea <andreaerdna@libero.it> ha scritto:

Ciao Pierluigi,
QgsVectorFileWriter.deleteShapeFile() può cancellare solo i file dello
Shapefile che non sono utilizzati da alcun processo.

QgsProject.instance().removeMapLayer(), quando utilizzato in uno script
Python, non rilascia tutti gli handle del processo qgis.exe dei due file
*.shp e *.dbf che quindi il sistema operativo considera ancora
utilizzati e non permette di cancellarli.
Gli handle vengono rilasciati solo alla fine dell’esecuzione dello script.
Il problema dovrebbe dipendere dal fatto che l’uso di
QgsProject.instance() non è thread-safe.
Se stai sviluppando un algoritmo di processing, potresti provare a
dichiararlo come QgsProcessingAlgorithm.FlagNoThreading

Se fai una ricerca in Internet con un motore di ricerca ti accorgerai
che si sono varie pagine su gis.stackexchange.com relative a questo
problema, oltre ad un paio di bug report nel repository GitHub di QGIS.

Se riesci a trovare una soluzione… facci sapere! Altrimenti forse
potresti sollevare la questione chiedendo chiarimenti nella mailing list
qgis-developer (nella quale pure è già stata in passato affrontata senza
risolverla).

A presto.

Andrea Giudiceandrea


QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/qgis-it-user