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?
7 Antworten
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)
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.
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.
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)
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)
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.
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
Verwandte Fragen
Verknüpfte Fragen
Neue Fragen
python
Python ist eine dynamisch typisierte Mehrzweck-Programmiersprache mit mehreren Paradigmen. Es wurde entwickelt, um schnell zu lernen, zu verstehen, zu verwenden und eine saubere und einheitliche Syntax durchzusetzen. Bitte beachten Sie, dass Python 2 ab dem 01.01.2020 offiziell nicht mehr unterstützt wird. Fügen Sie für versionenspezifische Python-Fragen das Tag [python-2.7] oder [python-3.x] hinzu. Wenn Sie eine Python-Variante (z. B. Jython, PyPy) oder eine Bibliothek (z. B. Pandas und NumPy) verwenden, fügen Sie diese bitte in die Tags ein.