【问题标题】:What is Wrong with the for Loopsfor 循环有什么问题
【发布时间】:2014-08-13 14:57:40
【问题描述】:

我无法从此代码中获得输出,我猜它只是无限循环,它必须读取行并将这些行附加到名为 data 的列表中,但它没有给出输出,我做错了什么? 任何建议将不胜感激,在此先感谢。

import os
import subprocess
import commands

command = ['sudo', 'iwlist', 'wlan0', 'scan']
output = subprocess.Popen(command, stdout=subprocess.PIPE).stdout.readlines()
data = []
for item in output:
      if item.strip().startswith('ESSID:'):
           data = (item.lstrip('ESSID:').rstrip('\n'))
      for item in output:
            if item.strip().startswith('Quality:'):
                 data.append('Quality:')
            for item in output:
                  if item.strip().startswith('Pairwise:'):
                       data.append('Pairwise:')
                       print data

【问题讨论】:

  • print output 紧跟在readlines() 之后,你看到了什么?另外,您的预期输出是什么样的?
  • sudo 需要密码,所以Popen 永远不会返回
  • 我现在正在检查@Cyber​​,没有命令在工作,问题出在 'ESSID:' 之后的循环
  • @Cyber​​ 它以未成形的形式打印 iwlist,但它是“sudo iwlist wlan0 scan”的输出

标签: python loops for-loop subprocess stdout


【解决方案1】:

试试下面的代码,我认为你不需要多个for 循环。

另外,iwlist 命令也可以在没有sudo 权限的情况下工作,所以你应该把它删掉(因为你不能用subprocess.PIPE 输入sudo 密码)

我还删除了 oscommands 模块,尽管这些模块已导入但并未在任何地方使用。

import subprocess

command = ['iwlist', 'wlan0', 'scan']
output = subprocess.Popen(command, stdout=subprocess.PIPE).stdout.readlines()
data = []
for item in output:
    if item.strip().startswith('ESSID:'):
         data.append([item.lstrip('ESSID:').rstrip('\n')])
    if item.strip().startswith('Quality:'):
        data.append('Quality:')
    if item.strip().startswith('Pairwise:'):
        data.append('Pairwise:')
print data

编辑

既然你想读取每个连接,试试这个

import subprocess

command = ['sudo', '-S', 'iwlist', 'wlan0', 'scan']
output = subprocess.Popen(command, stdout=subprocess.PIPE).stdout.read()
data = []
for cell_item in output.split("Cell"):
    data_item = []
    for line in cell_item.split("\n"):
        if any(item in line for item in ["ESSID", "Quality", "Pairwise"]):
            data_item.append(line.strip())
    if data_item:
        data.append(data_item)
print data

这里的技巧是首先按单元格拆分输出(基于我系统上 iwlist 的输出),然后,在每个单元格中,您可以检查 Quality, Pairwise, ESSID

【讨论】:

  • 感谢您的回答,是的,iwlist 在没有 sudo 的情况下也可以工作,您是对的,但是我需要使用 sudo 运行它才能看到我能看到的所有单元格,没有 sudo 我只能看到我连接的那个。
  • 它和我之前的代码有同样的问题,它只打印 ESSID,Quality 和 Pairwise 行不起作用
  • @TolgaVarol 检查编辑,系统会提示您输入当前版本的密码。如果我的回答有帮助,请不要忘记接受并投票。
  • @TolgaVarol 我还冒昧地取消了多个lstriprstripstrip
  • 感谢您的编辑,为什么会提示我输入密码? ,你的编辑效果很好,还有一件事我想问你我尝试了另一个代码,它只打印 ESSID 和地址,如果你有时间,你也可以检查一下,我正在处理它,但我不明白为什么,我对编程有点陌生,是的,lstrip 和 rstrip 是个大问题。
猜你喜欢
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 2014-11-27
  • 2016-05-05
  • 1970-01-01
相关资源
最近更新 更多