2017-04-18 72 views
1

我正在使用mac。我正在編寫代碼以使用python2.7獲取mac的batterylevel和batterystatus。下面是我寫的代碼,但我檢查了打印輸出變量,但它是空的。output = grep.communicate()[0]獲取電池使用情況時返回null

#!/usr/bin/env python 

import os 
import subprocess 

import psutil 


def getBatteryLevel(): 

    BATTERY_CMD = ["/usr/sbin/ioreg", "-l"] 
    GREP_CMD = ["/usr/bin/egrep", "Capacity|ExternalChargeCapable"] 

    process = subprocess.Popen(BATTERY_CMD, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    grep = subprocess.Popen(GREP_CMD, stdin=process.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    grep.wait() 
    output = grep.communicate()[0] 
    batteryStatus = output.split("\n") 

    maxCapacity = float(batteryStatus[1].split("=")[1].lstrip()) 
    curCapacity = float(batteryStatus[2].split("=")[1].lstrip()) 
    remaining = 100 * (curCapacity/maxCapacity) 

    print "BATTERY LEVEL : " 
    print remaining 

getBatteryLevel() 

我想是因爲我用的是Mac mini的grep的不給輸出。我用macbook pro進行測試,代碼工作正常

+0

你可以檢查'grep.wait()'的返回碼,看看它是0還是1.'grep'可能在你的輸出中找不到這個模式。我的建議是:在Python中本地執行'grep':你只有一個子進程,調試會更容易。 –

+0

我檢查了代碼,並且grep.wait()返回1 – AnjuT

+0

並不奇怪:雖然沒有找到pattern,儘管沒有打印:嘗試用'print(process.stdout.read(')')替換'grep = subprocess.Popen(...' ))''獲得你的第一條命令的輸出結果。在你的問題的[編輯]中發佈。 –

回答

0

最好避免從python運行子進程,當你可以避免它。

第一條命令難以避免,但python不僅僅能夠「模擬」grep。您運行的子進程越少,腳本的可移植性就越高。

我建議使用check_outputioreg調用(這使得它更簡單),然後將其拆分使用splitlines輸出,當他們匹配正則表達式過濾「有趣」的線。

import re 

def getBatteryLevel(): 
    BATTERY_CMD = ["/usr/sbin/ioreg", "-l"] 
    the_regex = re.compile("Capacity|ExternalChargeCapable") 

    output = subprocess.check_output(BATTERY_CMD)   
    batteryStatus = [l for l in output.splitlines() if the_regex.search(l)] 

不需要grep,你將避免它在各個系統中的怪癖/特異性。

相關問題