【发布时间】:2022-01-21 03:36:51
【问题描述】:
我正在尝试使用 python 运行 shell 命令 df -h | grep -w "/" 以观察根分区的使用情况,并希望避免使用 shell=True 选项以确保安全。
我尝试的代码如下:
import subprocess
p1 = subprocess.Popen(['df', '-h'], stdout=subprocess.PIPE)
p2 = subprocess.Popen(['grep', '-w', '"/"'], stdin=p1.stdout, stdout=subprocess.PIPE)
output=p2.communicate()[0]
print(output)
我得到的输出是:
$ ./subprocess_df_check.py
b''
预期输出是:
$ df -h | grep -w "/"
/dev/sdd 251G 4.9G 234G 3% /
【问题讨论】:
-
我认为 grep 可能正在寻找文字模式
"/"包括引号。尝试去掉双引号。反正你不需要它们,因为/不是 shell 特殊字符。 -
太好了,这就是问题所在。但现在输出打印为
(b'/dev/sdd 251G 4.9G 234G 3% /\n', None)。你如何从输出中删除那些额外的“b”、“\n”、“无”的东西? -
'grep', '-w', '/'-- 双引号用于外壳,而不是df。当你没有 shell 时,你不需要 shell 语法。 -
@JohnW,如果你还有括号和
None,这意味着你的真实代码没有[0],所以你打印的是(stdout, stderr)元组,而不仅仅是标准输出。使您的代码与您在问题中显示的内容相匹配,您就不会遇到这个问题。 (至于b'',我们在知识库中有数百个已经回答的问题:这意味着你有一个字节字符串而不是一个Unicode字符串)。
标签: python python-3.x subprocess