Comment fais-tu un simple “chmod + x” depuis Python?

Je veux créer un fichier à partir d’un script python exécutable.

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

Il semble que os.chmod n’ajoute pas de permissions comme le fait unix chmod . Avec la dernière ligne mise en commentaire, le fichier a le nom de fichier -rw-r--r-- , sans le commenter, le mode de fichier est ---x------ . Comment puis-je simplement append le drapeau u+x tout en gardant les autres modes intacts?

Utilisez os.stat() pour obtenir les permissions actuelles, utilisez | to ou les bits ensemble, et utilisez os.chmod() pour définir les permissions mises à jour.

Exemple:

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

Pour les outils qui génèrent des fichiers exécutables (par exemple, des scripts), le code suivant peut être utile:

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

Cela fait (plus ou moins) respecter le umask qui était en vigueur au moment de la création du fichier: L’exécutable n’est défini que pour ceux qui peuvent lire.

Usage:

 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 vous connaissez les permissions que vous souhaitez, l’exemple suivant peut vous permettre de restr simple.

Python 2:

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

Python 3:

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

Compatible avec soit (conversion en octal):

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

exemples d’permissions de référence

Vous pouvez aussi le faire

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

Liste actuelle du fichier

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

Maintenant, faites ceci.

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

et vous verrez cela dans le terminal.

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

Vous pouvez bitwise ou avec 0o111 pour rendre tout exécutable, 0o222 pour rendre tout accessible en écriture, et 0o444 pour que tout soit lisible.