2016-02-17 35 views
1

我有一个类似的问题,在这里问这里:Find size and free space of the filesystem containing a given file,但这个问题假设你已经知道关于系统的一些东西。在Python中,如何获取Mac OS X中所有分区的列表?

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

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

但我缺乏的是从python获得可靠的Mac OS X分区列表的方法。

Mac OS X没有/ proc,所以解析不起作用。我宁愿不要求外部二进制文件,因为我的目标是构建我的Python脚本以在Linux和Mac客户端上运行。有任何想法吗?

+0

的可能的复制:[查找大小和包含给定文件的文件系统的可用空间(http://stackoverflow.com/questions/4260116/find-size-and-free-space -of-the-filesystem-containing-a-given-file) –

+0

除了我已经清楚地指出这个问题的链接之外,事实并非如此。在这个问题中没有任何地方假设我们正在使用Mac OS X. 正如我明确指出的那样,我已经有了一个linux解决方案,该链接将探索。 – AThomas

+0

在这种情况下,可能重复:[在OS/X上的python查找可用磁盘空间](http://stackoverflow.com/questions/787776/find-free-disk-space-in-python-on-os-x )和[使用python保留在卷上的跨平台空间](http://stackoverflow.com/questions/51658/cross-platform-space-remaining-on-volume-using-python) –

回答

3

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

我已经在Linux上

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

这里在Mac上测试该两个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" 

输出

/dev is 100% full 
/net is 100% full 
/is 82% full 
/home is 100% 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" 
+0

谢谢,我会试试这个;我可能更喜欢用python而不是awk解析。 – AThomas

+1

@AThomas:你说得对。最好手动解析它;主要是因为'shell = True'是不安全的并且存在安全风险。我已经更新了我的答案 – Cripto

+1

我会将此标记为解决方案,因为这是我决定用于解决问题的方法,但其他答案在技术上回答了最初的问题,这对于寻找解决方案的人员也很有用。 – AThomas

2

我不相信有一个统一的,跨平台的方式做到这一点,但你可以使用subprocess模块和调用命令$ diskutil list这样的OS X

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

o将包含输出的diskutil命令。

+0

这看起来像最权威的方法,只要我有一个足够聪明的解析器用于diskutil - 当程序输出格式在上游发生更改时,我已经被咬了几次。 – AThomas

+0

这很有趣,你如何使用diskutil获得磁盘使用? – Cripto

+0

@Cripto我没有试图给他磁盘使用 - 只是回答“在Python中,我如何获得Mac OS X中所有分区的列表?”我给了你一个答案 - 这对你来说绝对是更好的选择。 – wpercy

相关问题