Використання exec в циклі for в python

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

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

Щоб спробувати отримати кількість відеокарт, встановлених у системі. Але, схоже, не вирівнюється синтаксис лінії цикла for.

Чи потрібно імпортувати бібліотеку для exec? Або я використовую це неправильно? Або обидва?

Дякую

3

4 Відповіді

exec executes Python code, not an external command. You're looking for 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)
6
додано
Я спробував це, каже stdout глобальний не визначений. Чи потрібно імпортувати щось інше?
додано Автор Danny, джерело
На жаль, я, мабуть, щось зіпсував, але працює зараз. Дякую!
додано Автор Danny, джерело

Ключове слово exec виконує код Python/em>. Він не запускає нові процеси.

Натомість спробуйте використати модуль підпроцес .

lines = subprocess.check_output(["lspci"]).split('\n')
count = sum('VGA' in line for line in lines)
5
додано
Це спрацювало, але RHEL5.5, здається, поставляється з 2.4.3, і я не можу легко оновити всі системи, які мені потрібні для розгортання цього. Збільшив хоч
додано Автор Danny, джерело

Ви хочете використовувати popen (або щось подібне). exec виключає код пітона. Наприклад:

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()
0
додано
модуль підпроцесора замінений os.popen
додано Автор Corey Goldberg, джерело

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

(Причиною використання tempfile є те, що якщо ви відкриваєте підпроцес і захоплюєте stdout за допомогою підпроцесу.

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
додано
Ваша програма (ви не можете звинувачувати Python для цього) буде зависати, тому що ви називаєте p.wait() перед читанням будь-якого виходу з труби. Розмір буфера кошика ОС, очевидно, становить 64k, тому програма ніколи не завершить роботу перед написанням всього свого виводу. Замість цього ви можете прочитати вивід труби до виклику p.wait() , уникаючи взагалі використання тимчасового файлу. Або ви можете використовувати щось подібне: subprocess.com > , який обробляє все це для вас.
додано Автор Greg Hewgill, джерело
Ваш підхід буде необхідним, якщо ви очікуєте дуже великого обсягу виводу (більше, ніж можна було б розумно вмістити в оперативній пам'яті, наприклад, сотні мегабайт), і хочете, щоб це було на диску. Для більшості цілей накопичення вихідних даних в оперативній пам'яті є нормальним.
додано Автор Greg Hewgill, джерело
Домовилися, що це питання розміру буфера буфера - не помилка python. Але мені подобається тимчасова обробка для цього. Як ви думаєте, у нього є якісь недоліки порівняно з читанням і додаванням рядка з труби або з використанням комунікації?
додано Автор uncreative, джерело
ІТ КПІ - Python
ІТ КПІ - Python
625 учасників

Канал обговорень про всякі штуки зі світу пайтону. Прохання: 0. мати повагу одне до одного; 1. не матюкатися в сторону людей; 2. не захламляти тред повідомленнями по одному слову;