繁体   English   中英

在python中重现'du'命令结果

[英]reproduce 'du' command results in python

我正在尝试使用python复制du命令。 问题是有时我无法访问某些文件/目录,通常可以通过重定向到null或使用grep -v隐藏Permission denied行来跳过这些文件/目录

这是功能

def du(path):
    """disk usage in kilobytes"""
    print "calculating disk usage for " + path + " ..."
    # return subprocess.check_output(['du', '-s',
    # path]).split()[0].decode('utf-8')
    try:
        output = subprocess.check_output(['ls', '-d', path, '|', 'parallel', '--no-notice', 'du', '-s', '2>&1', '|', 'grep', '-v', '"Permission denied"'], shell=True, stderr=subprocess.STDOUT).split()[0].decode('utf-8')
    except subprocess.CalledProcessError as e:
        raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))
    return output

问题在于,它会捕获退出代码并引发错误,是否可以在此函数中进行某些更改以跳过权限被拒绝的行?

谢谢

编辑

我添加了一个对我有用的功能的修改,以防万一有人想要一天完成此操作,这里是更新的功能

def du(path):
    """disk usage in kilobytes"""
    print "calculating disk usage for " + path + " ..."
    # return subprocess.check_output(['du', '-s',
    # path]).split()[0].decode('utf-8')
    try:
        p1 = subprocess.Popen(('ls', '-d', path), stdout=subprocess.PIPE)
        p2 = subprocess.Popen(('parallel', '--no-notice', 'du', '-s', '2>&1'), stdin=p1.stdout, stdout=subprocess.PIPE)
        p3 = subprocess.Popen(('grep', '-v', '"Permission denied"'), stdin=p2.stdout, stdout=subprocess.PIPE )
        output = p3.communicate()[0]
        #output = subprocess.check_output(['ls', '-d', path, '|', 'parallel', '--no-notice','du', '-s', '2>&1', '|', 'grep', '-v', '"Permission denied"'], shell=True, stderr=subprocess.STDOUT).split()[0].decode('utf-8')
    except subprocess.CalledProcessError as e:
        raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output))
    return ''.join([' '.join(hit.split('\t')) for hit in output.split('\n') if len(hit) > 0 and not "Permission" in hit])

如果您不希望它引发错误,请不要在您的except块中使用raise 也许只是打印到stderr。 您可能还希望更完整一些,并检查特定的错误,以确保仅避免抛出特定的错误。

另外,您可能想研究使用os.path.getsize而不是炮轰ls。

也许您可以看一下sh模块的内置du

from sh import du

然后,您可以使用所需的参数来调用它:

du()

您可以在以下位置找到该模块所需的所有内容: https : //github.com/amoffat/sh (包括安装,并包括有关sudo的讨论)。

答曰:

sh(以前是pbs)是Python 2.6-3.4的完整子流程替代品,它使您可以像调用一个函数一样调用任何程序...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM