我正在尝试运行一个遍历命令输出的每一行的for循环。例如:
for line in exec 'lspci | grep VGA':
count = count + 1
尝试获取系统中安装的视频卡数量。但它似乎没有排列for循环线上的语法。
我是否必须为exec导入库?或者我使用它错了?或两者兼而有之?
由于
答案 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