import os
test = os.system("ls /etc/init.d/ | grep jboss- | grep -vw jboss-")
for row in test:
print row
由于某种原因,这给出了TypeError:迭代非序列错误。
当我在没有for循环的情况下进行打印测试时,它会给出一个jboss实例的列表,并在底部加上一个“0”......哎?
答案 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所示,似乎更合适。