2012-10-09 11 views
79

Ich möchte eine Datei aus einem Python-Skript erstellen, das ausführbar ist.Wie machst du eine einfache "chmod + x" aus Python?

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

es erscheint os.chmod Berechtigungen 'Hinzufügen' nicht so, wie Unix chmod tut. Wenn die letzte Zeile auskommentiert ist, hat die Datei den Datei-Modus -rw-r--r--, mit ihr nicht auskommentiert, der Datei-Modus ist ---x------. Wie kann ich einfach die u+x Flagge hinzufügen, während der Rest der Modi intakt bleibt?

Antwort

133

Verwenden Sie os.stat(), um die aktuellen Berechtigungen zu erhalten, verwenden Sie | oder die Bits zusammen, und verwenden Sie os.chmod(), um die aktualisierten Berechtigungen festzulegen.

Beispiel:

import os 
import stat 

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

dies nur durch ausführbar macht die uns er. Das Plakat fragte nach "chmod + x", was es auf der ganzen Linie ausführbar macht (Benutzer, Gruppe, Welt) –

+26

Benutze das Folgende, um es für alle ausführbar zu machen ... stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH. Hinweis: Dieser Wert entspricht oktal 0111, also können Sie einfach st.st_mode | 0111 –

+0

[Meine Antwort unten] (http: // stackoverflow.com/a/30463972/119527) kopiert die R-Bits nach X, wie man es von einem Compiler erwartet. –

12

Für Werkzeuge, die ausführbaren Dateien (zB Skripte) erzeugen, der folgende Code könnte hilfreich sein:

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

Dies macht es (mehr oder weniger), um die umask zu respektieren, dass War in Kraft, als die Datei erstellt wurde: Executable wird nur für diejenigen gesetzt, die lesen können.

Verbrauch:

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) 
+2

Oktal Literale in Python 3 geändert. Statt '0444' würden Sie' 0o444' verwenden. Oder, wenn Sie beide unterstützen möchten, schreiben Sie einfach '292'. – Kevin

+1

@Kevin Es sieht so aus (https://docs.python.org/3.0/whatsnew/3.0.html#new-syntax) die neue Syntax wurde von Python 2.6 unterstützt, daher erscheint es sinnvoll, dies zu verwenden. (Für einen Kompatibilitätsreferenzpunkt wird CentOS 6 mit Python 2.6 ausgeliefert). –

+2

Ich war mir nicht bewusst, dass Python 3 die traditionellen oktalen Literale entfernt hatte. Also vielen Dank dafür. –

2

Sie können auch dieses tun

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

Aktuelle Auflistung der Datei

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

Jetzt tun.

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

und Sie werden dies im Terminal sehen.

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

können Sie bitweise oder mit 0o111, um alle ausführbar zu machen, 0o222 um alle beschreibbar zu machen, und 0o444 für alle lesbar zu machen.

3

Wenn Sie die gewünschten Berechtigungen kennen, ist das folgende Beispiel möglicherweise die einfachste Möglichkeit.

Python 2:

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

Python 3:

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

Kompatibel mit entweder (oktal conversion):

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

Referenz permissions examples

+4

Dies sollte os.chmod sein ("/ somedir/somefile", 0o775) –

Verwandte Themen