152

我想从一个可执行的 python 脚本中创建一个文件。

import os
import stat
os.chmod('somefile', stat.S_IEXEC)

它似乎os.chmod不像unixchmod那样“添加”权限。注释掉最后一行,文件有 filemode -rw-r--r--,没有注释掉,文件模式是---x------. 如何u+x在保持其余模式不变的同时添加标志?

4

7 回答 7

242

用于os.stat()获取当前权限,用于|OR 位,并用于os.chmod()设置更新的权限。

例子:

import os
import stat

st = os.stat('somefile')
os.chmod('somefile', st.st_mode | stat.S_IEXEC)
于 2012-10-09T02:19:58.493 回答
25

对于生成可执行文件(例如脚本)的工具,以下代码可能会有所帮助:

def make_executable(path):
    mode = os.stat(path).st_mode
    mode |= (mode & 0o444) >> 2    # copy R bits to X
    os.chmod(path, mode)

这使得它(或多或少)尊重umask创建文件时生效的内容:可执行文件仅设置为那些可以读取的文件。

用法:

path = 'foo.sh'
with open(path, 'w') as f:           # umask in effect when file is created
    f.write('#!/bin/sh\n')
    f.write('echo "hello world"\n')

make_executable(path)
于 2015-05-26T16:22:19.000 回答
16

如果您知道所需的权限,那么以下示例可能是保持简单的方法。

蟒蛇2:

os.chmod("/somedir/somefile", 0775)

蟒蛇 3:

os.chmod("/somedir/somefile", 0o775)

兼容任一(八进制转换):

os.chmod("/somedir/somefile", 509)

参考权限示例

于 2016-06-17T18:43:27.547 回答
14

如果您使用的是 Python 3.4+,则可以使用标准库的便捷pathlib

它的Path类具有内置的chmodstat方法。

from pathlib import Path
import stat


f = Path("/path/to/file.txt")
f.chmod(f.stat().st_mode | stat.S_IEXEC)
于 2019-05-08T21:39:10.633 回答
6

尊重umask喜欢chmod +x

man chmod表示如果augo没有给出如下:

chmod +x mypath

然后a使用但与umask

字母 ugoa 的组合控制哪些用户对文件的访问权限将被更改:拥有文件的用户 (u)、文件组中的其他用户 (g)、不在文件组中的其他用户 (o) 或所有用户(一)。如果这些都没有给出,效果就像给出 (a) 一样,但在 umask 中设置的位不受影响。

这样做的目的是让您不会意外授予太多权限。umask 确定新文件的默认权限,例如 umask为当前用户生成权限0077,因为 77 将排除组和其他(尽管默认情况下触摸不会给出 x)。并且由于掩码的一部分,同样只会为用户添加,忽略组和其他:您需要, ,或强制设置它们。touch newfile.txtrwchmod +x+x0011chmod o+xchmod g+xchmod go+xchmod a+x

这是一个完全模拟该行为的版本:

#!/usr/bin/env python3

import os
import stat

def get_umask():
    umask = os.umask(0)
    os.umask(umask)
    return umask

def chmod_plus_x(path):
    os.chmod(
        path,
        os.stat(path).st_mode |
        (
            (
                stat.S_IXUSR |
                stat.S_IXGRP |
                stat.S_IXOTH
            )
            & ~get_umask()
        )
    )

chmod_plus_x('.gitignore')

另请参阅:如何在 Python 中获取默认文件权限?

在 Ubuntu 16.04、Python 3.5.2 中测试。

于 2019-04-09T11:11:01.743 回答
5

你也可以这样做

>>> import os
>>> st = os.stat("hello.txt")

当前文件列表

$ ls -l hello.txt
-rw-r--r--  1 morrison  staff  17 Jan 13  2014 hello.txt

现在这样做。

>>> os.chmod("hello.txt", st.st_mode | 0o111)

你会在终端看到这个。

ls -l hello.txt    
-rwxr-xr-x  1 morrison  staff  17 Jan 13  2014 hello.txt

您可以按位或使用 0o111 使所有可执行,0o222 使所有可写,0o444 使所有可读。

于 2015-10-16T21:40:26.520 回答
-1

在python3中:

import os
os.chmod("somefile", 0o664)

请记住添加0o前缀,因为权限设置为八进制整数,Python 会自动将任何带有前导零的整数视为八进制。否则,您os.chmod("somefile", 1230)确实在通过,它是 的八进制数664

于 2019-02-14T13:06:12.070 回答