Ответ 1
Из документации
В Unix с оболочкой = True: [...] Если args - это последовательность, первый элемент указывает командной строки, и любые дополнительные элементы будут рассматриваться как дополнительные аргументы сама оболочка. То есть, Popen делает эквивалент:
Popen(['/bin/sh', '-c', args[0], args[1], ...])
Что переводит в вашем случае:
Popen(['/bin/sh', '-c', 'du', '-s', '-b', maildir])
Это означает, что -s
, -b
и maildir
интерпретируются как параметры оболочки, а не du
(попробуйте в командной строке оболочки!).
Так как shell=True
в любом случае не требуется в вашем случае, вы можете просто удалить его:
size = subprocess.Popen(['du', '-s', '-b', maildir],
stdout=subprocess.PIPE).communicate()[0].split()[0]
В качестве альтернативы вы можете просто использовать свой подход orignal, но в этом случае вам не нужен список. Вам также нужно будет позаботиться о пробелах в названии каталога:
size = subprocess.Popen('du -s -b "%s"' % maildir, shell=True,
stdout=subprocess.PIPE).communicate()[0].split()[0]