Python >> Tutoriel Python >  >> Python

Comment puis-je vérifier si un volume est monté là où il est censé utiliser Python ?

Solution 1 :

Je jetterais un œil à os.path.ismount() .

Solution 2 :

Pour une réponse définitive à quelque chose que seul le noyau sait avec certitude, demandez au noyau :

cat /proc/mounts

Ce fichier peut être lu / analysé comme s'il s'agissait d'un fichier normal, en utilisant les outils de votre choix. Y compris Python. Exemple rapide et salissant :

#!/usr/bin/python

d = {}

for l in file('/proc/mounts'):
    if l[0] == '/':
        l = l.split()
        d[l[0]] = l[1]

import pprint

pprint.pprint(d)

Solution 3 :

Le moyen le plus simple de vérifier est d'invoquer mount via subprocess et voir s'il apparaît là-bas. Pour un crédit supplémentaire, utilisez os.readlink() sur le contenu de /dev/disk/by-* pour savoir de quel appareil il s'agit.

Solution 4 :

Réponse bonus. Si le périphérique externe n'est pas monté, les données sont écrites sur la partition racine au chemin /external-backup . Si le périphérique externe est monté, les données sur la partition racine sont toujours là mais elles ne sont pas accessibles car /external-backup pointe maintenant vers un périphérique externe.

Solution 5 :

Vieille question, mais je pensais apporter ma solution (basée sur la réponse de Dennis Williamson et Ignacio Vazquez-Abrams) de toute façon. Puisque je l'utilise sur un environnement non-Linux pour vérifier les répertoires distants en cours de montage, /proc et mtab ne peut pas être utilisé et aucune vérification supplémentaire n'a été implémentée :

def is_mounted(special, directory):
    search_prefix = '{} on {}'.format(special, directory.rstrip('/'))

    if os.path.ismount(directory):
        mounts = subprocess.check_output(['mount']).split('\n')

        for line in mounts:
            if line[:len(search_prefix)] == search_prefix:
                return True;

    return False

Améliorations bienvenues !