2

我正在为 Kodi Media Center 开发一个服务插件,它将检查剩余的磁盘空间,并在空间低于 500MB 时提醒人们使用我创建的维护工具。它作为单独的服务运行。我需要一种在 Android 上使用 python 来确定剩余磁盘空间的方法。我尝试使用 statvfs() 但它显然只在类 Unix 系统上兼容,包括 OS X。这意味着我可以在 Linux 和 OSX 上使用 statvfs。我可以在 Windows 上使用 wmi 或 ctypes,但到目前为止还没有在 Android 上使用。我可以创建一个单独的包装器来检查操作系统并为每个包装器使用最佳方法 - 但我找不到可以做到这一点的适用于 Android 的 python 模块。有什么建议么?

这是我现有的代码:

import xbmc, xbmcgui, xbmcaddon
import os, sys, statvfs, time, datetime
from time import mktime

__addon__       = xbmcaddon.Addon(id='plugin.service.maintenancetool')
__addonname__   = __addon__.getAddonInfo('name')
__icon__        = __addon__.getAddonInfo('icon')

thumbnailPath = xbmc.translatePath('special://thumbnails');
cachePath = os.path.join(xbmc.translatePath('special://home'), 'cache')
tempPath = xbmc.translatePath('special://temp')
addonPath = os.path.join(os.path.join(xbmc.translatePath('special://home'), 'addons'),'plugin.service.maintenancetool')
mediaPath = os.path.join(addonPath, 'media')
databasePath = xbmc.translatePath('special://database')


if __name__ == '__main__':
    #check HDD freespace
    st = os.statvfs(xbmc.translatePath('special://home'))

if st.f_frsize:
    freespace = st.f_frsize * st.f_bavail/1024/1024
else:
    freespace = st.f_bsize * st.f_bavail/1024/1024

print "Free Space: %dMB"%(freespace)
if(freespace < 500):
    text = "You have less than 500MB of free space"
    text1 = "Please use the Maintenance tool"
    text2 = "immediately to prevent system issues"

    xbmcgui.Dialog().ok(__addonname__, text, text1, text2)


while not xbmc.abortRequested:    
    xbmc.sleep(500)

这是我得到的错误:

Error Type: <type 'exceptions.AttributeError'>
Error Contents: 'module' object has no attribute 'statvfs'
Traceback (most recent call last):
File "/storage/emulated/0/Android/data/org.xbmc.kodi/files/.kodi/addons/plugin.service.maintenancetool/service.py", line 39, in <module>
st = os.statvfs(xbmc.translatePath('special://home))
Attribute Error: 'module' object has no attribute 'statvfs'
4

1 回答 1

0

我在kodi 线程中找到了答案,这应该会返回 android 设备上剩余的字节:

if xbmc.getCondVisibility('system.platform.android'):
        import subprocess
        df = subprocess.Popen(['df', '/storage/emulated/legacy'], stdout=subprocess.PIPE)
        output = df.communicate()[0]
        info = output.split('\n')[1].split()
        size = float(info[1].replace('G', '').replace('M', '')) * 1000000000.0
        size = size - (size % float(info[-1]))
        available = float(info[3].replace('G', '').replace('M', '')) * 1000000000.0
        available = available - (available % float(info[-1]))
        return int(round(available)), int(round(size))
于 2017-09-21T13:42:14.697 回答