0

我对 python 和 subprocess 模块比较陌生。

我正在尝试使用 mac osx 上的子进程使用 python 获取目录大小。os.walk 需要很长时间来处理大型目录。我希望让子进程使用 shell 命令执行此操作并加快结果。这个shell命令对我有用,但我不能让它从子进程中工作?

( cd /test_folder_path && ls -nR | grep -v '^d' | awk '{total += $5} END {print total}' )

这就是我试图在 python 中创建子进程的方式。

import shlex 
import subprocess

target_folder = "/test_folder_path"
command_line = "( cd " + target_folder + " && ls -nR | grep -v '^d' | awk '{total += $5} END {print total}' )"
args = shlex.split(command_line)
print args
folder_size = subprocess.check_output(args)
print str(folder_size)

在 python 中,调用 subprocess.check_ouput 时出现以下错误

folder_size = subprocess.check_output(args) 文件“/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py”,第 568 行,在 check_output 过程中= Popen(stdout=PIPE,*popenargs,**kwargs)文件“/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py”,第 711 行,在init errread,errwrite)文件“/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py”,第 1308 行,在 _execute_child raise child_exception OSError: [Errno 2] No such file or directory

当我在 shell 命令中使用相同的目录时,它可以工作并为我提供正确的目录大小。

任何帮助使这种方法起作用或向我指出更好的方法将不胜感激。

4

1 回答 1

2

python 的子进程默认使用shell=False. 为了使用管道运行子命令,您需要 shell来防止 python 将管道(和&&)解释为cd.

target_folder = "/test_folder_path"
command_line = "cd " + target_folder + " && ls -nR | grep -v '^d' | awk '{total += $5} END {print total}'"
folder_size = subprocess.check_output(command_line, shell=True)

我已经尝试了上述方法,只使用了drawk建议的命令:

>>> import subprocess
>>> folder_size = subprocess.check_output('cd ~/mydir && du -c | tail -n 1', shell=True)
>>> folder_size
b'113576\ttotal\n'

一切似乎都很好。

如评论中所述,subprocess.Popen(以及扩展名,check_output)还接受一个cwd参数,该参数是从中运行命令的目录。这消除了在您的命令中对目录进行任何更改的需要:

>>> import subprocess
>>> result = subprocess.check_output('du -c | tail -n 1', cwd='/path/to/home/mydir', shell=True)
>>> result
'113576\ttotal\n'
于 2013-11-03T02:11:52.017 回答