【问题标题】:In Python, how do I get a list of all partitions in Mac OS X?在 Python 中,如何获取 Mac OS X 中所有分区的列表?
【发布时间】:2016-02-17 23:15:00
【问题描述】:

我有一个与此处提出的问题类似的问题:Find size and free space of the filesystem containing a given file,但该问题假设您已经对该系统有所了解。

我有一个任务:对于数量不确定的机器,包括定期部署的新机器,我有/需要一个 python 脚本,如果任何分区太满,我可以向我报告。 (是的,它是由 icinga2 部署的)。

我不做的是手工制作和个性化每台机器的脚本参数,以告知它我要检查的分区;我运行脚本,它只是向我报告系统上所有现存的分区。我让系统本身成为自己的权威,而不是从外部定义要检查的分区。这在 linux 中可以正常工作,正如上面链接的答案所示,在 linux 中,我们可以解析 /proc 中的文件以获取权威列表。

但我缺少的是一种从 python 获取 Mac OS X 中可靠分区列表的方法。

Mac OS X 没有 /proc,因此无法解析。我宁愿不调用外部二进制文件,因为我的目标是构建我的 python 脚本以在 linux 和 mac 客户端上运行。有什么想法吗?

【问题讨论】:

  • 除非,正如我已通过指向该问题的链接明确指出的那样,事实并非如此。在这个问题中没有任何地方假设我们正在使用 Mac OS X。正如我已经明确指出的那样,我已经有一个 linux 解决方案,该链接将对其进行探索。
  • 这两个假设我已经知道文件系统是什么。我必须将分区作为参数传递。我需要的是输出分区本身的东西,这样我就可以在其中一个程序中使用该信息。我无法通过询问首先需要我告诉它分区才能工作的程序来发现分区。

标签: python macos diskspace icinga


【解决方案1】:

由于您想要一个跨平台(Mac 和 Linux)选项,您可以使用两个平台上都可用的 df 命令。您可以通过subprocess访问它。

我已经针对 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" 

【讨论】:

  • 谢谢,我试试这个;不过,我可能更喜欢用 python 解析而不是 awk。
  • @AThomas:你是对的。最好手动解析;主要是因为shell=True 不安全且存在安全风险。我已经更新了答案
  • 我会将其标记为解决方案,因为这是我决定用于解决我的问题的方法,但另一个答案在技术上回答了最初的问题,这对寻找该解决方案的人很有用也是。
【解决方案2】:

我不相信有一个统一的跨平台方法可以做到这一点,但您可以使用 subprocess 模块并像这样在 OS X 上调用命令 $ diskutil list

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

o 将包含diskutil 命令的输出。

【讨论】:

  • 这看起来是最权威的方法,只要我有一个足够聪明的diskutil解析器——我在上游改变程序输出格式时被咬过几次。
  • 这很有趣,如何使用 diskutil 获取磁盘使用情况?
  • @Cripto 我并没有试图给他磁盘使用率 - 只是回答“在 Python 中,如何获取 Mac OS X 中所有分区的列表?”这个问题。我为您的回答投了赞成票 - 这绝对是完成这项任务的更好选择。
  • @wilbur:我很兴奋并阅读了手册页。我希望 diskutil 有办法做到这一点。我在另一个项目中需要它,因为 diskutil 知道磁盘何时被加密。
  • 我已将另一个答案标记为我的特定问题的解决方案,但从技术上讲,这个答案是正确的答案,希望它对寻找这个特定问题的答案的其他人也有用.谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 2011-02-20
相关资源
最近更新 更多