为什么os.chflags()在Linux下不起作用 [英] Why os.chflags() doesn't work under Linux
问题描述
追溯(最近的最后一次呼叫):
文件/ home / lexer / py / /tests/main.py,第43行,< module>
os.chflags(path_to_file(file_name),stat.SF_NOUNLINK)
AttributeError:'module'对象没有属性'chflags'
有一个问题已经很久以前已经提出了,但是我仍然不明白为什么os.chflags()不会做chattr命令的工作。任何人可以详细说明一下?
Linux不提供 chflags
syscall ,所以Python不提供包装器 os.chflags()
。
chattr
命令使用代码( e2fsprogs-1.42.13
的 lib / e2p / fsetflags.c
):
fd = open(name,OPEN_FLAGS);
if(fd == -1)
return -1;
f =(int)flags;
r = ioctl(fd,EXT2_IOC_SETFLAGS,& f);
if(r == -1)
save_errno = errno;
close(fd);
设置文件的扩展属性,所以如果你把它移植到Python(并使用一些C从 ext2fs / ext2_fs.h
)中提取 EXT2_IOC_SETFLAGS
的值,您可以执行以下操作:
#!/ usr / bin / python2
import fcntl
import os
import struct
#取自ext2fs / ext2_fs.h。
EXT2_IMMUTABLE_FL = 0x00000010
EXT2_IOC_SETFLAGS = 0x40086602
fd = os.open('/ var / tmp / testfile',os.O_RDWR)
f = struct.pack 'i',EXT2_IMMUTABLE_FL)
fcntl.ioctl(fd,EXT2_IOC_SETFLAGS,f);
os.close(fd)
Etvoilà:
[tim @ passepartout〜] $ lsattr / var / tmp / testfile
---- i ----------- / var / tmp / testfile
[tim @ passepartout〜] $
执行 chattr(1)
作为子进程可能要比将上述概念验证成可靠运行而不进行维护的情况更为谨慎。 p>
I'm using Python 2.7.9 under Debian GNU/Linux 8 (jessie) 64-bit. I just try to change file attributes applying os.chflags(path, mode). In Python docs there is an article about os interface which says that this method is available in Unix, but it doesn't work for Linux. Python always throws:
Traceback (most recent call last):
File "/home/lexer/py/epam/tests/main.py", line 43, in <module>
os.chflags(path_to_file(file_name), stat.SF_NOUNLINK)
AttributeError: 'module' object has no attribute 'chflags'
There is an issue has been already raised for that a long time ago, but still I can't understand why os.chflags() doesn't do 'chattr' command job. Anybody could elaborate it?
Linux does not provide the chflags
syscall, so Python does not provide the wrapper os.chflags()
.
The chattr
command uses the code (e2fsprogs-1.42.13
's lib/e2p/fsetflags.c
):
fd = open (name, OPEN_FLAGS);
if (fd == -1)
return -1;
f = (int) flags;
r = ioctl (fd, EXT2_IOC_SETFLAGS, &f);
if (r == -1)
save_errno = errno;
close (fd);
to set the extended attributes for a file, so if you port that to Python (and use some C to extract the value for EXT2_IOC_SETFLAGS
from ext2fs/ext2_fs.h
), you can do something like:
#!/usr/bin/python2
import fcntl
import os
import struct
# Taken from ext2fs/ext2_fs.h.
EXT2_IMMUTABLE_FL = 0x00000010
EXT2_IOC_SETFLAGS = 0x40086602
fd = os.open('/var/tmp/testfile', os.O_RDWR)
f = struct.pack('i', EXT2_IMMUTABLE_FL)
fcntl.ioctl(fd, EXT2_IOC_SETFLAGS, f);
os.close(fd)
Et voilà:
[tim@passepartout ~]$ lsattr /var/tmp/testfile
----i----------- /var/tmp/testfile
[tim@passepartout ~]$
But for all practical purposes it is probably much more prudent to execute chattr(1)
as a child process than to turn the proof-of-concept above into something that runs reliably without maintenance.
这篇关于为什么os.chflags()在Linux下不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!