Использование exec в цикле for в python - PullRequest
3 голосов
/ 27 октября 2011

Я пытаюсь запустить цикл for, который проходит через каждую строку вывода команды. Например:

for line in exec 'lspci | grep VGA':
    count = count + 1

Чтобы попытаться получить количество видеокарт, установленных в системе. Но это не похоже на синтаксис строки цикла for.

Нужно ли импортировать библиотеку для exec? Или я использую это неправильно? Или оба?

Спасибо

Ответы [ 4 ]

6 голосов
/ 27 октября 2011

exec выполняет код Python, а не внешнюю команду. Вы ищете subprocess.Popen():

import subprocess
p = subprocess.Popen('lspci', stdout=subprocess.PIPE)
for line in p.stdout:
  if 'VGA' in line:
    print line.strip()
p.wait()

На моей коробке это напечатано

01:00.0 VGA compatible controller: nVidia Corporation GF104 [GeForce GTX 460] (rev a1)
5 голосов
/ 27 октября 2011

Ключевое слово exec выполняет Код Python .Он не запускает новые процессы.

Попробуйте вместо этого модуль подпроцесс .

lines = subprocess.check_output(["lspci"]).split('\n')
count = sum('VGA' in line for line in lines)
0 голосов
/ 27 октября 2011

Я написал эту служебную функцию в python для таких целей

(Причина использования tempfile заключается в том, что если вы откроете подпроцесс и захватите стандартный вывод с помощью subprocess.PIPE, когда стандартный вывод станет большечем 64 КБ данных, Python просто зависает навсегда.)

import logging
import tempfile
import subprocess
import os


def getPipedCommandOut(cmd):
    """
    cmd - command to execute

    gathers output of command (stderr and stdout) into a temp file

    returns the output of the command
    """
    logging.debug('starting %s' % cmd)

    temp = tempfile.TemporaryFile('w+t')
    try:
        p = subprocess.Popen(cmd, stderr=subprocess.STDOUT,stdout=temp.fileno(), shell=True)
        #pid, status = os.waitpid(p.pid,0) #@UnusedVariable
        status = p.wait()
        temp.seek(0)
        out = temp.read()
        if status != 0:
            raise CommandRunError("COMMAND: %s\tFAILED: %s%s%s" % (cmd, status, os.linesep, out))
        logging.debug('finished %s' % cmd)
    finally: 
        temp.close()
    return out

затем использовать с вашим кодом:

lspciOutput = getPipedCommandOut('lspci | grep VGA')
for line in lspciOutput:
    count = count + 1
0 голосов
/ 27 октября 2011

Вы хотите использовать popen (или что-то подобное).exec оправдывает код Python.Например:

exec('x = 4')
print x  # prints 4

Кроме того, вам не хватает скобок, что делает его не грамматическим.exec является функцией:

for line in exec('lspci | grep VGA'):  # this still does not do what you want
    count = count + 1

Вы можете использовать wc -l, чтобы получить количество строк в одном кадре.

import os
count = os.popen('lspci | grep VGA | wc -l').read()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...