160 votes

Comment faites-vous un simple "chmod + x" depuis python?

Je souhaite créer un fichier à partir d'un script python exécutable.

 rendered = Template(template).render()
f = open('somefile', 'w')
f.write(rendered)
f.close()
os.chmod('somefile', stat.S_IEXEC)
 

il apparaît que os.chmod ne «ajoute» pas les autorisations comme unix chmod fait. Avec la dernière ligne commentée, le fichier a le filemode -rw-r--r-- , sans commentaire, le mode de fichier est ---x------ . Comment puis-je simplement ajouter le drapeau u+x tout en conservant intact le reste des modes?

252voto

Ignacio Vazquez-Abrams Points 312628

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

Exemple:

 import os
import stat   
rendered = Template(template).render()
f = open('somefile', 'w')
f.write(rendered)
f.close()
st = os.stat('somefile')
os.chmod('somefile', st.st_mode | stat.S_IEXEC)
 

1voto

inspectorG4dget Points 25092

os.system(cmd) vous permet d'exécuter cmd comme une commande sur la ligne de commande à partir du répertoire de travail courant.

Donc, os.chdir(myDir) et os.system(chmod +x …) permettra de vous rendre où vous devez aller.

EDIT:

Il est vrai que cela vous ouvre à un grand nombre de vulnérabilités que vous serait d'injecter l'équivalent de la saisie de l'utilisateur (soit à partir de l'utilisateur final ou de vous-même) en os.system. Depuis, essentiellement, cela donne beaucoup d'accès à la ligne de commande, il peut ne pas être le plus sûr de pratiques. J'ai seulement suggéré, car elle est le plus "simple", le sens de la façon qui vous oblige à apprendre le moins de nouveaux modules et fonctionnalités. En effet, pour une solution plus robuste, os.stat est le chemin à parcourir

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X