Python TypeError:在简单列表上迭代非序列

时间:2013-10-03 20:10:46

标签: python

import os

test = os.system("ls /etc/init.d/ | grep jboss- | grep -vw jboss-")
for row in test:
    print row

由于某种原因,这给出了TypeError:迭代非序列错误。

当我在没有for循环的情况下进行打印测试时,它会给出一个jboss实例的列表,并在底部加上一个“0”......哎?

2 个答案:

答案 0 :(得分:6)

os.system()返回进程的退出代码 grep命令的结果。这始终是一个整数。与此同时,进程本身的输出不会被重定向,因此它直接写入stdout(绕过Python)。

你不能迭代一个整数。

如果要检索命令的stdout输出,则应使用subprocess.check_output() function

在这种情况下,您最好使用os.listdir()并在Python中编码整个搜索代码:

for filename in os.listdir('/etc/init.d/'):
    if 'jboss-' in filename and not filename.startswith('jboss-'):
        print filename

我已将grep -vw jboss-命令解释为使用jboss过滤掉 start 的文件名;根据需要调整。

答案 1 :(得分:1)

问题是,os.system返回退出代码。如果要捕获输出,可以使用subprocess.Popen

import subprocess
p = subprocess.Popen("ls", stdout=subprocess.PIPE),
out, err = p.communicate()
files = out.split('\n')

另请注意,鼓励使用subprocess模块:

  

子流程模块提供了更强大的工具来生成新流程并检索其结果;使用该模块比使用此[os.system]函数更可取。

如果你不必诉诸shell,那么纯粹的python解决方案,如@Martijn Pieters所示,似乎更合适。