在python中的for循环中使用exec

时间:2011-10-27 18:53:00

标签: python exec

我正在尝试运行一个遍历命令输出的每一行的for循环。例如:

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

尝试获取系统中安装的视频卡数量。但它似乎没有排列for循环线上的语法。

我是否必须为exec导入库?或者我使用它错了?或两者兼而有之?

由于

4 个答案:

答案 0 :(得分:6)

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)

答案 1 :(得分:5)

关键字exec执行 Python代码。它不会启动新流程。

请尝试使用subprocess模块。

lines = subprocess.check_output(["lspci"]).split('\n')
count = sum('VGA' in line for line in lines)

答案 2 :(得分:0)

您想要使用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()

答案 3 :(得分:0)

为了那些目的,我在python中编写了这个实用程序函数

(使用tempfile的原因是,如果你打开一个子进程并使用subprocess.PIPE捕获stdout,当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