Python-检查linux分区是只读还是读写?

Python-检查linux分区是只读还是读写?,python,linux,Python,Linux,我有一个在beaglebone上运行的python应用程序。如何在Python中检查/mnt分区是以只读还是读写方式装入的?编辑:答案假设您计划写入/mnt 我会尝试写入它并捕获OSError异常以处理只读情况。编辑:答案假设您计划写入/mnt 我会尝试对其进行写入并捕获OSError异常以处理只读情况。这将为您解决问题: def isMountReadonly(mnt): with open('/proc/mounts') as f: for line in f:

我有一个在beaglebone上运行的python应用程序。如何在Python中检查/mnt分区是以只读还是读写方式装入的?

编辑:答案假设您计划写入/mnt


我会尝试写入它并捕获OSError异常以处理只读情况。

编辑:答案假设您计划写入/mnt


我会尝试对其进行写入并捕获OSError异常以处理只读情况。

这将为您解决问题:

def isMountReadonly(mnt):
    with open('/proc/mounts') as f:
        for line in f:
            device, mount_point, filesystem, flags, __, __ = line.split()
            flags = flags.split(',')
            if mount_point == mnt:
                return 'ro' in flags
        raise ValueError('mount "%s" doesn\'t exist' % mnt)

print "read only: %s" % isMountReadonly('/mnt')
输出:

read only: False

这将为您带来好处:

def isMountReadonly(mnt):
    with open('/proc/mounts') as f:
        for line in f:
            device, mount_point, filesystem, flags, __, __ = line.split()
            flags = flags.split(',')
            if mount_point == mnt:
                return 'ro' in flags
        raise ValueError('mount "%s" doesn\'t exist' % mnt)

print "read only: %s" % isMountReadonly('/mnt')
输出:

read only: False

解决方案非常简单,只有1个系统调用STATVF

stat = os.statvfs('/mnt')

# Python < 3.2
ST_RDONLY = 1
readonly = bool(stat.f_flag & ST_RDONLY)

# Python >= 3.2
readonly = bool(stat.f_flag & os.ST_RDONLY)

解决方案非常简单,只有1个系统调用STATVF

stat = os.statvfs('/mnt')

# Python < 3.2
ST_RDONLY = 1
readonly = bool(stat.f_flag & ST_RDONLY)

# Python >= 3.2
readonly = bool(stat.f_flag & os.ST_RDONLY)

嘿,Boris,这看起来是一个有趣的问题,但也许你应该阅读SO FAQ,然后修改它,使之类似于我们在SO上看到的样式:我“能够做到:out=os.popen'mount | grep/mnt”。阅读并解析输出字符串/dev/mmcblk0p4 on/mnt类型vfat rw,relatime,fmask=0022,dmak=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount ro,但感觉应该有更好的方法。。。好的luck@Borisw37:是的,您不需要调用外部命令,顺便说一句,对于这类事情,popen被subprocess取代。你可以使用os.accessdirname,os.W_好的,正如我在对andrekeller的评论中提到的。嘿Boris,这看起来是个有趣的问题,但也许你应该阅读SO FAQ,然后修改它,使之类似于我们在SO上看到的样式:我“能够做到这一点:out=os.popen'mount | grep/mnt”。读取并解析输出字符串/dev/mmcblk0p4 on/mnt-type vfat-rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=重新安装ro,但感觉应该有更好的方法。beaglebone运行python。。。好的luck@Borisw37:是的,您不需要调用外部命令,顺便说一句,对于这类事情,popen被subprocess取代。你可以使用os.accessdirname,os.W_OK,正如我在对andrekeller的评论中提到的。为什么要投否决票?我相信这是一个有效的方法,因为它避免了在检查和实际写入之间状态变化的竞争条件。同意。您可以使用os.accessdirname,os.W_OK,但正如文档中所说:注意:使用access检查用户是否有权在实际打开文件之前使用open打开文件会造成安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔来操纵文件。另外,请注意:即使访问表明I/O操作会成功,I/O操作也可能失败,特别是对于网络文件系统上的操作,这些操作的权限语义可能超出了通常的POSIX权限位模型。我正在尝试防止SD卡可能损坏。其思想是,通过Web服务器,用户可以看到分区的状态,并能够在使用WinSCP将文件上载到分区之前手动将其设置为ro/rw。用户需要知道分区是RO还是RW来作为警告answer@Borisw37:啊。在这种情况下,你应该将这些信息编辑到你的问题中。为什么要投否决票?我相信这是一个有效的方法,因为它避免了在检查和实际写入之间状态变化的竞争条件。同意。您可以使用os.accessdirname,os.W_OK,但正如文档中所说:注意:使用access检查用户是否有权在实际打开文件之前使用open打开文件会造成安全漏洞,因为用户可能会利用检查和打开文件之间的短时间间隔来操纵文件。另外,请注意:即使访问表明I/O操作会成功,I/O操作也可能失败,特别是对于网络文件系统上的操作,这些操作的权限语义可能超出了通常的POSIX权限位模型。我正在尝试防止SD卡可能损坏。其思想是,通过Web服务器,用户可以看到分区的状态,并能够在使用WinSCP将文件上载到分区之前手动将其设置为ro/rw。用户需要知道分区是RO还是RW来作为警告answer@Borisw37:啊。在这种情况下,你应该将这些信息编辑到你的问题中。