¿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)