Я пытаюсь воспроизвести команду du
с использованием python. Проблема заключается в том, что иногда у меня нет доступа к некоторым файлам/каталогам, которые я обычно прыгают, перенаправив обнулить или сокрытие Permission denied
линии с помощью grep -v
Выполнение команды «du» в python
Вот функция
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
проблема в том, что он фиксирует код выхода и все равно выдает ошибку, есть ли что-то, что я могу изменить в этой функции, чтобы пропустить строки, лишенные разрешений?
Благодаря
EDIT
Я добавил модификацию функции, которая работала для меня в случае, если кто-то хочет, чтобы получить это сделать один день здесь обновленная функция
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])
был не я, который был downvoted – Rad
'sys.stderr' make вызов' sys.exit() 'в процессе, который я считаю. – Zizouz212
'python -c 'import sys; sys.exit (1) '; echo $? 'выходит с 1. Но' python -c 'import sys; print >> sys.stderr, "foobar" '; echo $? 'выходит с 0 – Monadically