python获取linux文件不可变属性

时间:2016-02-19 09:02:20

标签: python linux immutability

我可以使用https://www.elastic.co/guide/en/watcher/current/condition.html 获取路径名的咒语,mtime,atime .... 但是,我有一个文件,其中有一个' + i'属性,你可以看到: os.stat(pathname) 有没有办法知道路径名是否有' + i'使用python属性?

2 个答案:

答案 0 :(得分:0)

似乎没有class VideoWriter: def __init__(self, fn=None, fcc='MJPG', fps=7.5): ... self.fcc, self.fps, self.dt = fcc, fps, 1./fps self.q, self._stop, self.n = Queue.Queue(), False, 0 self.wrtr = threading.Thread(target=self._writer) self.wrtr.start() def _writer(self): frm = firstTime = vw = None while True: if self._stop: break # get most recent frame while not self.q.empty(): frm = self.q.get_nowait() if frm is not None: if vw is None: vw = cv2.VideoWriter(self.fn+self._EXT, cvFourcc(self.fcc), self.fps, imgSize(frm), isColor=numChannels(frm)>1) firstTime = time.time() vw.write(frm) self.n += 1 dt = self.dt if firstTime is None else max(0, firstTime + self.n*self.dt - time.time()) time.sleep(dt) # write frame; can be called at rate different from fps def write(self, frm): self.q.put(frm) 模块函数来获取这些Linux文件属性,但您可以使用subprocess模块在​​Python中调用os命令。

下面的代码应该适用于Python 2或3,尽管在最近的Python版本中它可以更紧凑。

FWIW,我在我的fstab文件上设置了lsattr位,因为我厌倦了随机消失。

i

更新

此代码的先前版本

import subprocess

def is_immutable(fname):
    p = subprocess.Popen(['lsattr', fname], bufsize=1, stdout=subprocess.PIPE)
    data, _ = p.communicate()
    #print(data)
    return 'i' in data.split(None, 1)[0]

print(is_immutable("/etc/fstab"))

但是,如果文件名中存在“i”,会检测到“i”!新版本在属性标志中检测到“i”。谢谢,sverasch引起了我的注意。

答案 1 :(得分:0)

This related SO post关于Linux上不存在os.chflags的原因显示了使用lsattr解决os模块中fcntl缺席问题的方法。但是,它依赖于从头文件(ext2fs / ext2_fs.h)复制常量定义,所以它很脆弱。一个更永久的解决方案需要编写一些C或类似Cython的东西。

同时,PM 2Ring的答案有效,但应修改它以使用包含字母“i”的路径。也许有一些声誉的人可以评论或编辑这个答案(这是我的第一篇文章)?

import subprocess

def is_immutable(fname):
    p = subprocess.Popen(['lsattr', fname], bufsize=1, stdout=subprocess.PIPE)
    data, _ = p.communicate()
    #print(data)
    return 'i' in data

def is_immutable_safe(file_path):
    """Check if the immutable flag is set on a Linux file path

    Uses the lsattr command, and assumes that the immutable flag
    appears in the first 16 characters of its output.
    """
    return 'i' in subprocess.check_output(['lsattr', file_path])[:16]

# These assertions will pass if the immutable bit is not set on
# /etc/inittab on your system
assert is_immutable('/etc/inittab') is True
assert is_immutable_safe('/etc/inittab') is False