【问题标题】:Python TypeError: iteration over non-sequence on simple listPython TypeError:简单列表上的非序列迭代
【发布时间】:2013-10-03 20:10:45
【问题描述】:
import os

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

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

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

【问题讨论】:

  • 阅读the documentationos.system 不会返回您使用它运行的程序的任何输出。
  • 您会看到来自管道的标准输出与 test (0) 的实际值的组合,然后结束。

标签: python


【解决方案1】:

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

你不能遍历一个整数。

如果您想检索命令的标准输出输出,您应该使用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 开始 的文件名;根据需要进行调整。

【讨论】:

    【解决方案2】:

    问题是,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,那么 @Martijn Pieters 建议的纯 python 解决方案似乎更可取。

    【讨论】:

      猜你喜欢
      • 2015-12-15
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2015-10-23
      • 2017-04-19
      • 1970-01-01
      • 2018-10-20
      相关资源
      最近更新 更多