Я пытаюсь запустить цикл for, который проходит через каждую строку вывода команды. Например:
for line in exec 'lspci | grep VGA':
count = count + 1
Чтобы попытаться получить количество видеокарт, установленных в системе. Но это не похоже на синтаксис строки цикла for.
Мне нужно импортировать библиотеку для exec? Или я использую это неправильно? Или оба?
благодаря
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)
Ключевое слово exec
выполняет код Python . Он не запускает новые процессы.
Вместо этого попробуйте подпроцесс .
lines = subprocess.check_output(["lspci"]).split('\n')
count = sum('VGA' in line for line in lines)
Вы хотите использовать 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()
Я написал эту функцию утилиты в python для таких целей
(Причина использования временного файла заключается в том, что если вы откроете подпроцесс и запишете stdout с помощью subprocess.PIPE, когда stdout получит более 64k данных, 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