python中的Bash命令

时间:2018-10-08 15:39:28

标签: python subprocess

我正在python中运行代码,该代码计算目录中存在的文件数

hadoop fs -count /user/a909983/sample_data/ | awk '{print $2}'

这会成功在linux命令行中返回 0 ,因为目录为。但是,当我在python脚本中运行它时,它会返回 1 python中的代码行是:

directoryEmptyStatusCommand = subprocess.call(
["hadoop", "fs", "-count", "/user/a909983/sample_data/", "|", "awk '{print $2}'"])

我该如何纠正?还是我想念什么?我也尝试过使用Popen,但是结果是一样的。

1 个答案:

答案 0 :(得分:3)

使用subprocess.Popen并且不要使用管道|,因为它需要shell=True带来哪些安全风险。因此,请使用subprocess.PIPE并将其与subprocess.check_output一起使用,而无需使用管道,这就是正确的方法。

因此,您可以尝试以下操作:

command = subprocess.Popen(("hadoop", "fs", "-count", "/user/a909983/sample_data/") , stdout=subprocess.PIPE)
output = subprocess.check_output(("awk '{print $2}'"), stdin=command.stdout)

如果您想通过启用shell=True来尝试Shell命令:

cmd = "hadoop fs -count /user/a909983/sample_data/ | awk '{print $2}'"
command = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = command.communicate()[0]
print(output)