Quero criar um arquivo de dentro de um script python que é executável.
import os
import stat
os.chmod('somefile', stat.S_IEXEC)
parece os.chmod
que não 'adiciona' permissões como o Unix chmod
faz. Com a última linha comentada, o arquivo tem o modo de arquivo -rw-r--r--
, sem comentar, o modo de arquivo é ---x------
. Como posso apenas adicionar o u+x
sinalizador enquanto mantenho o resto dos modos intactos?
STAT_OWNER_EXECUTABLE = stat.S_IEXEC
, e usaria a constante local legível por humanos em vez do jargão.subprocess.check_call(['chmod', '+x', 'somefile'])
e permite que você faça operações comoa+rx
.Para ferramentas que geram arquivos executáveis (por exemplo, scripts), o código a seguir pode ser útil:
Isso faz com que (mais ou menos) respeite o
umask
que estava em vigor quando o arquivo foi criado: Executável é definido apenas para aqueles que podem ler.Uso:
fonte
0444
, você usaria0o444
. Ou, se quiser apoiar os dois, basta escrever292
.Se você souber as permissões que deseja, o exemplo a seguir pode ser a maneira de mantê-lo simples.
Python 2:
Python 3:
Compatível com (conversão octal):
exemplos de permissões de referência
fonte
Você também pode fazer isso
Lista atual de arquivo
Agora faça isso.
e você verá isso no terminal.
Você pode bit a bit ou com 0o111 para tornar todos executáveis, 0o222 para tornar todos graváveis e 0o444 para tornar todos legíveis.
fonte
Respeito
umask
comochmod +x
man chmod
diz que seaugo
não for fornecido como em:então
a
é usado, mas comumask
:Esta é uma versão que simula exatamente esse comportamento:
Consulte também: Como posso obter as permissões de arquivo padrão em Python?
Testado no Ubuntu 16.04, Python 3.5.2.
fonte
Em python3:
Lembre-se de adicionar o
0o
prefixo, pois as permissões são definidas como um inteiro octal e o Python trata automaticamente qualquer inteiro com um zero à esquerda como octal. Caso contrário, você estáos.chmod("somefile", 1230)
realmente passando , o que é octal de664
.fonte
chmod +
conforme solicitado pelo OP, que deve adicionar novas permissões às existentes.Se você estiver usando o Python 3.4+, poderá usar o pathlib conveniente da biblioteca padrão .
Sua classe Path possui métodos internos chmod e stat .
fonte