我想列出一个文件,然后在线条中搜索模式,就像我在Bash中一样。
cat /etc/passwd | grep nologin
我尝试以下方法:
#!/usr/bin/python3
import subprocess
CMD=('cat', '/etc/passwd')
SEARCH="nologin"
PIPE_ERG=subprocess.Popen(CMD , stdout=subprocess.PIPE)
OUTPUT = PIPE_ERG.communicate()[0].splitlines()
for LINE in OUTPUT:
if SEARCH in LINE:
print(LINE)
如果我用python3执行脚本,我总是得到这个错误消息:
Traceback (most recent call last):
File "./pipe2.py", line 11, in <module>
if SEARCH in LINE:
TypeError: 'str' does not support the buffer interface
当我只打印没有搜索的行时,脚本会列出我的所有行。
如何使用模式获得每一行&#34; nologin&#34;从输出?
答案 0 :(得分:0)
在Python 3中,PIPE_ERG.communicate()[0]
不是str
,而是bytes
,而对于bytes
,in
运算符未定义。您必须先将bytes
转换为str
。最简单的方法是在循环中执行LINE = str(LINE)
,或使用LINE.decode()
:
for LINE in OUTPUT:
LINE = LINE.decode()
if SEARCH in LINE:
print(LINE)
或者将Popen
与universal_newlines=True
:
PIPE_ERG=subprocess.Popen(CMD , stdout=subprocess.PIPE, universal_newlines=True)
来自文档:
默认情况下,此函数将以编码字节的形式返回数据。该 输出数据的实际编码可能取决于命令 调用,所以解码到文本往往需要在处理 应用水平。
可以通过将universal_newlines设置为True
来覆盖此行为