Chcę utworzyć plik z poziomu skryptu Pythona, który jest wykonywalny.
import os
import stat
os.chmod('somefile', stat.S_IEXEC)
wygląda na to, os.chmod
że nie „dodaje” uprawnień tak, jak chmod
robi to unix . Gdy ostatnia linia jest wykomentowana, plik ma kod pliku -rw-r--r--
, a nie zakomentowany, tryb pliku to ---x------
. Jak mogę po prostu dodać u+x
flagę, zachowując pozostałe tryby w stanie nienaruszonym?
STAT_OWNER_EXECUTABLE = stat.S_IEXEC
lokalnej stałej czytelnej dla człowieka zamiast bełkotliwego.subprocess.check_call(['chmod', '+x', 'somefile'])
i pozwólmy ci łatwiej wykonywać operacje takie jaka+rx
.W przypadku narzędzi generujących pliki wykonywalne (np. Skrypty) pomocny może być następujący kod:
To sprawia, że (mniej lub bardziej) respektuje to,
umask
co obowiązywało podczas tworzenia pliku: Plik wykonywalny jest ustawiany tylko dla tych, które mogą czytać.Stosowanie:
źródło
0444
użyłbyś0o444
. Lub, jeśli chcesz wspierać oba, po prostu napisz292
.Jeśli znasz uprawnienia, które chcesz, poniższy przykład może być sposobem na uproszczenie.
Python 2:
Python 3:
Kompatybilny z (konwersja ósemkowa):
przykłady uprawnień referencyjnych
źródło
Ty też możesz to zrobić
Bieżąca lista plików
Zrób to teraz.
i zobaczysz to w terminalu.
Możesz ustawić bitowo lub 0o111, aby uczynić wszystko wykonywalnym, 0o222, aby uczynić wszystko zapisywalnym, a 0o444, aby uczynić wszystko czytelnym.
źródło
Szacunek
umask
jakchmod +x
man chmod
mówi, że jeśliaugo
nie jest podane jak w:wtedy
a
jest używany, ale zumask
:Oto wersja, która dokładnie symuluje takie zachowanie:
Zobacz też: Jak mogę uzyskać domyślne uprawnienia do plików w Pythonie?
Testowane w Ubuntu 16.04, Python 3.5.2.
źródło
W python3:
Pamiętaj, aby dodać
0o
przedrostek, ponieważ uprawnienia są ustawiane jako ósemkowe liczby całkowite, a Python automatycznie traktuje każdą liczbę całkowitą z wiodącym zerem jako liczbę ósemkową. W przeciwnym razieos.chmod("somefile", 1230)
rzeczywiście mijasz, czyli ósemkowo od664
.źródło
chmod +
co prosi OP, który powinien dodać nowe uprawnienia do istniejących.Jeśli używasz Pythona 3.4+, możesz użyć wygodnej pathlib biblioteki standardowej .
Jego klasa Path ma wbudowane metody chmod i stat .
źródło