python chmod

¿Cómo se hace un simple "chmod+x" desde python?



(4)

Quiero crear un archivo desde dentro de una secuencia de comandos python que sea ejecutable.

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

parece que os.chmod no ''agrega'' permisos como lo hace unix chmod . Con la última línea comentada, el archivo tiene el modo de archivo -rw-r--r-- , sin comentario, el modo de archivo es ---x------ . ¿Cómo puedo simplemente agregar el indicador u+x manteniendo el resto de los modos intactos?


Para las herramientas que generan archivos ejecutables (por ejemplo, scripts), el siguiente código podría ser útil:

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

Esto hace que (más o menos) respete la umask que estaba vigente cuando se creó el archivo: el ejecutable solo está configurado para aquellos que pueden leer.

Uso:

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)


Si conoce los permisos que desea, entonces el siguiente ejemplo puede ser la manera de hacerlo simple.

Python 2:

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

Python 3:

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

Compatible con cualquiera (conversión octal):

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

ejemplos de permisos de referencia


También puedes hacer esto

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

Listado actual del archivo

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

Ahora hacer esto.

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

y verá esto en la terminal.

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

Puede hacer en bit a bit o con 0o111 para hacer todo ejecutable, 0o222 para hacer que todo sea grabable y 0o444 para que todo sea legible.


Use os.stat() para obtener los permisos actuales, use | os.chmod() los bits juntos, y use os.chmod() para establecer los permisos actualizados.

Ejemplo:

import os import stat st = os.stat(''somefile'') os.chmod(''somefile'', st.st_mode | stat.S_IEXEC)