Quiero crear un archivo desde un script de Python que sea ejecutable.
import os
import stat
os.chmod('somefile', stat.S_IEXEC)
parece os.chmod
que no 'agrega' permisos como lo chmod
hace Unix . Con la última línea comentada, el archivo tiene el -rw-r--r--
modo de archivo, sin comentar, el modo de archivo es ---x------
. ¿Cómo puedo simplemente agregar la u+x
bandera manteniendo intactos el resto de los modos?
STAT_OWNER_EXECUTABLE = stat.S_IEXEC
, y usaría la constante local legible por humanos en lugar del galimatías.subprocess.check_call(['chmod', '+x', 'somefile'])
y le permite realizar operaciones comoa+rx
.Para las herramientas que generan archivos ejecutables (por ejemplo, scripts), el siguiente código puede ser útil:
Esto hace que se respete (más o menos) lo
umask
que estaba en vigor cuando se creó el archivo: Ejecutable solo está configurado para aquellos que pueden leer.Uso:
fuente
0444
, usarías0o444
. O, si desea apoyar a ambos, simplemente escriba292
.Si conoce los permisos que desea, el siguiente ejemplo puede ser la forma de simplificarlo.
Python 2:
Python 3:
Compatible con (conversión octal):
ejemplos de permisos de referencia
fuente
También puedes hacer esto
Listado actual del archivo
Ahora hacer esto.
y verá esto en la terminal.
Puede bit a bit o con 0o111 para hacer todo ejecutable, 0o222 para hacer que todo se pueda escribir y 0o444 para hacer que todo sea legible.
fuente
Respeto
umask
comochmod +x
man chmod
dice que siaugo
no se da como en:luego
a
se usa pero conumask
:Aquí hay una versión que simula ese comportamiento exactamente:
Consulte también: ¿Cómo puedo obtener los permisos de archivo predeterminados en Python?
Probado en Ubuntu 16.04, Python 3.5.2.
fuente
En python3:
Recuerde agregar el
0o
prefijo ya que los permisos se establecen como un entero octal y Python trata automáticamente cualquier entero con un cero a la izquierda como octal. De lo contrario, está pasando deos.chmod("somefile", 1230)
hecho, que es octal de664
.fuente
chmod +
como lo solicita OP, que debería agregar nuevos permisos a los existentes.Si está usando Python 3.4+, puede usar el conveniente pathlib de la biblioteca estándar .
Su clase Path tiene métodos chmod y stat integrados .
fuente