Ich möchte eine Datei aus einem ausführbaren Python-Skript erstellen.

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

Es scheint, dass os.chmod keine Berechtigungen wie Unix chmod hinzufügt. Wenn die letzte Zeile auskommentiert ist, hat die Datei den Dateimodus -rw-r--r--. Wenn sie nicht auskommentiert ist, lautet der Dateimodus ---x------. Wie kann ich einfach das Flag u+x hinzufügen, während die restlichen Modi intakt bleiben?

130
priestc 9 Okt. 2012 im 06:18

7 Antworten

Beste Antwort

Verwenden Sie os.stat(), um die aktuellen Berechtigungen abzurufen, verwenden Sie | to 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)
176
kbtz 19 Jän. 2016 im 20:27

Sie können dies auch 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

Mach das jetzt.

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

Sie können bitweise oder mit 0o111 alles ausführbar machen, 0o222 alles beschreibbar machen und 0o444 alles lesbar machen.

3
ncmathsadist 16 Okt. 2015 im 21:40

Respektiere umask wie chmod +x

man chmod sagt, dass wenn augo nicht wie in angegeben ist:

chmod +x mypath

Dann wird a verwendet, aber mit umask:

Eine Kombination der Buchstaben ugoa steuert, welcher Benutzerzugriff auf die Datei geändert wird: der Benutzer, dem sie gehört (u), andere Benutzer in der Dateigruppe (g), andere Benutzer, die nicht zur Dateigruppe gehören (o) oder alle Benutzer (a). Wenn keine davon angegeben ist, ist der Effekt so, als ob (a) angegeben worden wäre, aber Bits, die in der Umask gesetzt sind, sind nicht betroffen.

Hier ist eine Version, die dieses Verhalten genau simuliert:

#!/usr/bin/env python3

import os
import stat

def get_umask():
    umask = os.umask(0)
    os.umask(umask)
    return umask

def chmod_plus_x(path):
    os.chmod(
        path,
        os.stat(path).st_mode |
        (
            (
                stat.S_IXUSR |
                stat.S_IXGRP |
                stat.S_IXOTH
            )
            & ~get_umask()
        )
    )

chmod_plus_x('.gitignore')

Siehe auch: Wie kann ich die Standarddateiberechtigungen erhalten? Python?

Getestet in Ubuntu 16.04, Python 3.5.2.

1
Ciro Santilli 新疆改造中心法轮功六四事件 18 Juli 2019 im 05:58

Wenn Sie Python 3.4+ verwenden, können Sie die praktische pathlib .

Die Path -Klasse verfügt über eine integrierte chmod und stat Methoden.

from pathlib import Path


f = Path("/path/to/file.txt")
f.chmod(f.stat().st_mode | stat.S_IEXEC)
0
cs01 8 Mai 2019 im 21:39

Für Tools, die ausführbare Dateien generieren (z. B. Skripte), kann der folgende Code 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)

Dadurch wird (mehr oder weniger) das umask berücksichtigt, das beim Erstellen der Datei gültig war: Die ausführbare Datei ist nur für diejenigen festgelegt, die lesen können.

Verwendung:

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)
17
Jonathon Reinhart 23 Jän. 2016 im 16:39

In Python3:

import os
os.chmod("somefile", 0o664)

Denken Sie daran, das Präfix 0o hinzuzufügen, da Berechtigungen als oktale Ganzzahl festgelegt sind und Python jede Ganzzahl mit einer führenden Null automatisch als oktal behandelt. Andernfalls übergeben Sie tatsächlich os.chmod("somefile", 1230), was ein Oktal von 664 ist.

1
funkid 10 Apr. 2019 im 06:42

Wenn Sie die gewünschten Berechtigungen kennen, können Sie dies anhand des folgenden Beispiels einfach halten.

Python 2:

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

Python 3:

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

Kompatibel mit beiden (Oktalumwandlung):

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

Verweisen Sie auf Berechtigungsbeispiele

10
Drise 6 Dez. 2017 im 21:15