Как в Python получить список всех разделов в Mac OS X?

У меня есть вопрос, аналогичный заданному здесь: file">Найти размер и свободное место в файловой системе, содержащей данный файл, но этот вопрос предполагает, что вы уже что-то знаете о системе.

У меня есть задача: для неопределенного количества машин, включая новые, которые регулярно развертываются, у меня есть/нужен скрипт на python, который может сообщить мне, если какой-либо из разделов слишком заполнен. (Да, это развернуто icinga2).

Чего я не делаю, так это вручную создаю и персонализирую аргументы сценария для каждой машины, чтобы информировать ее о разделах, которые я хочу проверить; Я запускаю скрипт, и он просто сообщает мне обо всех существующих разделах в системе. Я позволяю самой системе управлять собой, а не определять извне, какие разделы проверять. Это нормально работает в Linux, и, как показывает приведенный выше ответ, в Linux мы можем проанализировать файл в / proc, чтобы получить авторитетный список.

Но чего мне не хватает, так это способа получить надежный список разделов в Mac OS X из python.

В Mac OS X нет /proc, поэтому синтаксический анализ не сработает. Я бы предпочел не вызывать внешний двоичный файл, поскольку моя цель — создать мой скрипт на Python для работы как на клиентах Linux, так и на Mac. Любые идеи?


person Mercury00    schedule 17.02.2016    source источник
comment
comment
За исключением того, что, как я ясно заявил со ссылкой на этот вопрос, это не так. В этом вопросе нигде нет предположения, что мы используем Mac OS X. Как я прямо заявил, у меня уже есть решение для Linux, которое исследует эта ссылка.   -  person Mercury00    schedule 18.02.2016
comment
comment
Оба они предполагают, что я уже знаю, что такое файловые системы. Я должен передать раздел в качестве аргумента. Что мне нужно, так это что-то, что выводит сами разделы, чтобы я мог использовать эту информацию в программе, подобной одной из этих. Я не могу обнаружить разделы, попросив программу, которая сначала нуждается во мне, сказать ей, что разделы работают.   -  person Mercury00    schedule 18.02.2016


Ответы (2)


Поскольку вам нужен кроссплатформенный вариант (Mac и Linux), вы можете использовать команду df. который доступен на обеих платформах. Вы можете получить к нему доступ через подпроцесс.

Я тестировал это как для OS X 10.11, так и для Ubuntu Linux 15.

import subprocess

process = subprocess.Popen(['df -h | awk \'{print $(NF-1),$NF}\''], stdout=subprocess.PIPE, shell=True)
out, err = process.communicate()
out = out.splitlines()[1:] # grab all the lines except the header line
results = {}
for i in out:
    tmp = i.split(' ')
    results[tmp[1]] = tmp[0]

for key, value in results.items():
    print key + " is " + str(value) +" full"

Вывод на Mac

/dev is 100% full
/net is 100% full
/ is 82% full
/home is 100% full

Вывод в Linux

/dev is 1% full
/run/lock is 0% full
/run is 1% full
/ is 48% full

Вот как вы можете сделать это без awk

import subprocess

process = subprocess.Popen(['df', '-h'], stdout=subprocess.PIPE)
out, err = process.communicate()
out = out.splitlines()[1:] # grab all the lines except the header line

for i in out:
    tmp = i.split(' ')
    tmp2 = []
    for x in tmp:
        if x != '':
            tmp2.append(x)
    print tmp2[-1] + " is " + tmp2[-2] + " full" 
person Cripto    schedule 17.02.2016
comment
Спасибо, я попробую это; Я, вероятно, предпочту анализировать в python, а не в awk. - person Mercury00; 18.02.2016
comment
@ATomas: Ты прав. Лучше разобрать вручную; в основном потому, что shell=True небезопасен и представляет угрозу безопасности. я обновил свой ответ - person Cripto; 18.02.2016
comment
Я отмечу это как решение, потому что это то, что я решил использовать для своей проблемы, но другой ответ технически отвечает на первоначальный вопрос, что также будет полезно для людей, которые ищут это решение. - person Mercury00; 24.02.2016

Я не верю, что существует единый кросс-платформенный способ сделать это, но вы можете использовать subprocess модуль и вызовите команду $ diskutil list, как это для OS X

import subprocess
p = subprocess.Popen(['diskutil', 'list'], stdout=subprocess.PIPE)
o = p.stdout.read()

o будет содержать вывод команды diskutil.

person wpercy    schedule 17.02.2016
comment
Это выглядит как самый авторитетный метод, если у меня есть достаточно умный парсер для diskutil - меня несколько раз укусили, когда формат вывода программы изменился выше по течению. - person Mercury00; 18.02.2016
comment
Интересно, как вы получаете использование диска с помощью diskutil? - person Cripto; 18.02.2016
comment
@Cripto Я не пытался указать ему использование диска - просто отвечая на вопрос, как в Python получить список всех разделов в Mac OS X? Я дал вам голос за ваш ответ - это определенно лучший вариант для этой задачи. - person wpercy; 18.02.2016
comment
@wilbur: я был взволнован и прочитал справочные страницы. Я бы хотел, чтобы у diskutil были средства для этого. Мне это нужно было в другом проекте, потому что diskutil знает, когда диск зашифрован. - person Cripto; 18.02.2016
comment
Я отметил другой ответ как решение моей конкретной проблемы, но этот ответ технически является правильным ответом, который, надеюсь, будет полезен для других людей, которые также ищут ответ на этот конкретный вопрос. Спасибо! - person Mercury00; 24.02.2016
comment
@AThomas Да, другой ответ был намного лучше для того, что вы пытались сделать, а именно для возможности работать как в OS X, так и в Linux. - person wpercy; 24.02.2016