[英]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.