web-dev-qa-db-fra.com

Comment supprimer un lien symbolique en python?

J'ai essayé de supprimer certains liens symboliques dans mon répertoire de travail, mais je rencontre des problèmes.

os.remove supprime également le contenu réel du dossier d'origine du lien

os.shutil renvoie une erreur en cas de liens symboliques.

Existe-t-il un moyen de supprimer un lien symbolique en utilisant les commandes python sans détruire le contenu d'origine?

Merci

24
akshayc11

os.unlink() fonctionne pour moi. Il supprime le lien symbolique sans supprimer le répertoire auquel il renvoie.

27
samfrances

La réponse acceptée ne fonctionne pas sous Windows avec des liens créés via mklink /D. Si tel est votre problème, la réponse a été publiée dans cette question: Supprimer le lien symbolique vers le répertoire sous Windows

Le code suivant devrait fonctionner sur les deux systèmes:

if(os.path.isdir(targetLink)):
    os.rmdir(targetLink)
else:
    os.unlink(targetLink)
2
MOnsDaR

Si le nom du répertoire contient une barre oblique de fin, la commande linux rm suivra le lien et essaiera de supprimer le répertoire. Voir Supprimer un lien symbolique vers un répertoire . Le os.removedocumentation indique qu'il vous donnera un OSError si vous essayez de supprimer un répertoire mais peut-être que cela ne se produit pas toujours dans le cas des liens symboliques.

2
John Watts

Désolé, mon mauvais, j'avais fait une stupide erreur de programmation: je supprimais bêtement la source au lieu des liens.

La bonne réponse est par @samfrances.

os.unlink fait l'affaire.

En plus de cela, voici quelques autres conseils si vous souhaitez effacer un répertoire en utilisant python:

Certainement pas threadsafe, mais vous avez l'idée ...

def rm(obj):

    if os.path.exists(obj):
        if os.path.isdir(obj):
            if os.path.islink(obj):
                 os.unlink(obj)
            else:
                shutil.rmtree(obj)
        else:
            if os.path.islink(obj):
                os.unlink(obj)
            else:
                os.remove(obj)
2
akshayc11

dans Python 3.4 et supérieur, si le lien est un fichier, utilisez unlink().

>>> from pathlib import Path
>>> p = Path('/some/file/')
>>> p.unlink()

Si le chemin pointe vers un répertoire, utilisez plutôt Path.rmdir ().

>>> from pathlib import Path
>>> p = Path('/some/dir/')
>>> p.rmdir()
1
SuperNova