2015-11-13 12 views
6

Próbuję napisać skrypt Pythona, aby dowiedzieć się, czy urządzenie dyskowe istnieje w/dev, ale zawsze generuje False. W inny sposób to zrobić?Python: Sprawdź, czy istnieje urządzenie/dev/disk

Próbowałem

>>> import os.path 
>>> os.path.isfile("/dev/bsd0") 
False 
>>> os.path.exists("/dev/bsd0") 
False 

$ ll /dev 
... 
brw-rw---- 1 root disk 252, 0 Nov 12 21:28 bsd0 
... 
+0

Spróbuj 'os.path.isabs'? –

Odpowiedz

3

To nie był rygorystycznie testowane, ale wydaje się działać:

import stat 
import os.stat 

def disk_exists(path): 
    try: 
      return stat.S_ISBLK(os.stat(path).st_mode) 
    except: 
      return False 

Wyniki:

disk_exists("/dev/bsd0") 
True 
disk_exists("/dev/bsd2") 
False 
+1

Nie sądzę, że 'import os.stat' jest potrzebny. (Przynajmniej z python3) – gerardw

1

Niektóre niekonwencjonalne sytuacja dzieje się tutaj.

os.path.isfile() powróci True dla zwykłych plików dla plików urządzeń będzie to False.

Ale jak dla os.path.exists(), documetation stwierdza, że ​​False może być zwrócony, jeśli „uprawnienie nie jest przyznane wykonać os.stat()”. FYI realizacja os.path.exists jest:

def exists(path): 
    """Test whether a path exists. Returns False for broken symbolic links""" 
    try: 
     os.stat(path) 
    except OSError: 
     return False 
    return True 

Tak więc, jeśli os.stat zawodzi cię nie widzę, jak ls może mieć udało (ls AFAIK wzywa również stat() syscall). Tak, sprawdź co os.stat('/dev/bsd0') jest podnoszenie zrozumieć, dlaczego nie jesteś zdolny do bycia wykryć istnienie tego konkretnego pliku urządzenia z os.path.exists, ponieważ używając os.path.exists() ma jest poprawnym sposobem sprawdzenia istnienia bloku plik urządzenia.