使用python为文件设置执行位

Per*_*nce 14 python macos file-io

在Mac OS上使用python,我想打开一个文件进行编写并将一些shell命令放入其中.后来要在终端运行.

with open("my_script.sh", "w") as fd:
    fd.write("#!/bin/sh\n")
    fd.write("echo $PATH\n")
Run Code Online (Sandbox Code Playgroud)

这将创建文件,但我无法想象如何设置执行位,所以当我在终端中运行它时我不会得到:

sh: my_script.sh: Permission denied
Run Code Online (Sandbox Code Playgroud)

Tom*_*rdt 21

import os
os.chmod("my_script.sh", 0744)
Run Code Online (Sandbox Code Playgroud)

尽管选择正确的值.某些值可能不安全.

  • 你需要使用`0o744`来兼容Python 3. (8认同)

aba*_*ert 10

在运行它之前,您始终可以使用终端shell执行此操作chmod:

chmod a+x my_script.sh
Run Code Online (Sandbox Code Playgroud)

如果你想从Python中做到这一点,您可以使用chmodfchmodos模块.由于你已经打开了文件,我会做后者:

with open("my_script.sh", "w") as fd:
    fd.write("#!/bin/sh\n")
    fd.write("echo $PATH\n")
    os.fchmod(fd.fileno(), stat.S_IRWXU | stat.S_IRWXG | stat.S_IROTH | stat.S_IXOTH)
Run Code Online (Sandbox Code Playgroud)

不幸的是,正如你所看到的,没有直接相当于为每个人chmod a+x添加x标志而留下其他一切.但是你可以做同样的事情chmod命令行工具实际上做:stat文件(或者,在这种情况下,fstat),以获取现有的权限,然后对其进行修改:

with open("my_script.sh", "w") as fd:
    fd.write("#!/bin/sh\n")
    fd.write("echo $PATH\n")
    mode = os.fstat(fd.fileno()).st_mode
    mode |= stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
    os.fchmod(fd.fileno(), stat.S_IMODE(mode))
Run Code Online (Sandbox Code Playgroud)

(你实际上并不需要S_IMODE在大多数平台上使用该步骤,因为它们st_mode没有任何额外的位,或者(f)chmod无害地忽略它们 - 就像OS X那样.但是最好做正确的事情,使你的代码可移植并且面向未来.)

大多数人认为"友好"的名字,比如S_IXUSR是不是特别友好,一旦你学会了思考在八方面的模式,它实际上不是试图记住POSIX如何简写事情变得简单,所以你可能会喜欢这样的:

with open("my_script.sh", "w") as fd:
    fd.write("#!/bin/sh\n")
    fd.write("echo $PATH\n")
    mode = os.fstat(fd.fileno()).st_mode
    mode |= 0o111
    os.fchmod(fd.fileno(), mode & 0o7777)
Run Code Online (Sandbox Code Playgroud)

111用户,组和其他可执行的方法(与|各种ST_IX*位相同),并且7777是允许传递给(f)的所有位(与之chmod相同S_IMODE).