Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Trouver le périphérique qui contient un fichier

+4 votes

J'aimerais trouver une fonction qui me permette, à partir de l'emplacement d'un fichier, d'obtenir des informations sur le système de fichier sur lequel se trouve ce fichier.
En gros, c'est un équivalent au programme "df" en bash.

Obtenir l'emplacement du périphérique me suffirait, puisque la bibliothèque pyblkid me permet ensuite d'obtenir les autres infos.

Il me faut juste savoir sur quel périphérique se trouve le fichier.
Ça n'a pas besoin d'être portable (juste les *nix).

demandé 8-Jul-2015 par Laërte (346 points)

1 Réponse

+2 votes
 
Meilleure réponse

En gros, c'est un équivalent au programme "df" en bash.

OPTION 1 : @Boblinux

Pourquoi ne pas utiliser directement df (étant donné que t'es sur linux) :

df_output_lines = [s.split() for s in os.popen("df -Ph").read().splitlines()]

t'as un rendu du genre (si tu cherches juste à avoir la taille du fichier donc en utilisant l'option -Ph):

Size
28G
814M 
485M   

Pour ne pas t'embrouiller, le bout de code important dans tout ça c'est :

 os.popen("df")

OPTION 2 : @Laërte

En utilisant psutil et une fonction que j'ai codé qui trouve le point
de montage de la partition sur laquelle est un fichier, ça marche

import path
import psutil

def find_mount(location):
    location = path.Path(location)
    if location.parent.ismount() or location.parent == "/":
        return location.parent
    else:
        return find_mount(location.parent)

def find_disk(path):
    mountpoint = find_mount(path)
    for disque in psutil.disk_partitions():
        if disque.mountpoint == mountpoint:
            return disque.mountpoint
    return None

OPTION 3 : Lib psutil

Tu peux aussi utiliser cette lib pour jouer avec df :

It implements many functionalities offered by command line tools such
as: ps, top, lsof, netstat, ifconfig, who, df, kill, free, nice,
ionice, iostat, iotop, uptime, pidof, tty, taskset, pmap.

répondu 8-Jul-2015 par boblinux (3,092 points)
edité 11-Jul-2015 par boblinux

Si je ne me trompe pas, il faut utiliser subprocess.call plutôt que os.popen.
Exécuter des commandes externes et analyser leur sortie n'est pas plus lent qu'une fonction directement écrite en python ?

J'sais pas si c'est plus lent mais ce qui est sûr c'est que c'est moins chiant ;)

Pourquoi réinventer la roue quand une solution existe et fonctionne.

Après faut voir est-ce t'as des contraintes en termes de temps d'exécution ou non, si tu taf sur des très gros projets analysant des millions de fichiers ou non, dans ce cas là ça peut (peut-être) changer la donne

J'ai pas vraiment de contrainte, non, c'est pour mon usage perso. ^^
Le but c'était de trouver le nom du périphérique sur lequel se trouve un fichier (/dev/sda1 par exemple).

En utilisant psutil et une fonction que j'ai codé qui trouve le point de montage de la partition sur laquelle est un fichier, ça marche

import path
import psutil

def find_mount(location):
    location = path.Path(location)
    if location.parent.ismount() or location.parent == "/":
        return location.parent
    else:
        return find_mount(location.parent)

def find_disk(path):
    mountpoint = find_mount(path)
    for disque in psutil.disk_partitions():
        if disque.mountpoint == mountpoint:
            return disque.mountpoint
    return None

Sinon, pour plus de possibilités, faire un appel à df est plus simple. ^^
Mais là j'ai ce qu'il me faut.

Cool le pb est résolu alors ;)

J'ai édité la réponse avec les deux solutions du coup pour qu'il y ait un peu plus de visibilité

@Laerte

Tu peux aussi tester l'option 3, elle a l'air d'être un peu plus pytonesque pour utiliser df

...