Подтвердить что ты не робот

Python-модуль os.chmod(файл, 664) не изменяет разрешения на rw-rw-r-- but -w-wx ----

Недавно я использую модуль python os, когда я пытался изменить разрешение файла, я не получил ожидаемого результата. Например, я намеревался изменить разрешение на rw-rw-r -,

os.chmod("/tmp/test_file", 664)

Фактическое разрешение на владение - w - wx --- (230)

--w--wx--- 1 ag ag 0 Mar 25 05:45 test_file

Однако, если я изменю код 664 на 0664 в коде, результат будет именно тем, что мне нужно, например.

os.chmod("/tmp/test_file", 0664)

Результат:

-rw-rw-r-- 1 ag ag 0 Mar 25 05:55 test_file

Может ли кто-нибудь помочь объяснить, почему ведущий 0 настолько важен, чтобы получить правильный результат?

4b9b3361

Ответ 1

Нашел это на форуме

Если вам интересно, почему этот главный ноль важен, это потому, что разрешения устанавливаются как восьмеричное целое число, а Python - автоматически обрабатывает любое целое число с начальным нулем как восьмеричное. Итак, os.chmod( "файл", 484) (в десятичной форме) даст тот же результат.

Что вы делаете, это передать 664, который в восьмеричном 1230

В вашем случае вам понадобится

os.chmod("/tmp/test_file", 436)

[Обновить] Примечание. Для Python 3 у вас есть префикс с 0o (ноль о). E.G, 0o666

Ответ 2

Так что для людей, которые хотят семантику, похожую на:

$ chmod 755 somefile

Использование:

$ python -c "import os; os.chmod('somefile', 0o755)"

Если ваш Python старше 2.6:

$ python -c "import os; os.chmod('somefile', 0755)"

Ответ 3

начало "0" означает, что это восьмеричная константа, а не десятичная. и вам нужно восьмеричное изменение режима файла.

Разрешения - это битовая маска, например, rwxrwx --- это 111111000 в двоичном формате, и очень легко группировать биты на 3 для преобразования в восьмеричное, чем вычислять десятичное представление.

0644 (восьмеричный) - 0,110.100.100 в двоичном формате (я добавил точки для удобочитаемости) или, как вы можете вычислить, 420 в десятичном формате.

Ответ 4

Используйте символы разрешений вместо цифр

Вашей проблемы можно было бы избежать, если бы вы использовали более семантически названные символы разрешений, а не необработанные магические числа, например для 664:

#!/usr/bin/env python3

import os
import stat

os.chmod(
    'myfile',
    stat.S_IRUSR |
    stat.S_IWUSR |
    stat.S_IRGRP |
    stat.S_IWGRP |
    stat.S_IROTH
)

Это задокументировано в https://docs.python.org/3/library/os.html#os.chmod, а имена совпадают со значениями POSIX C API, задокументированными в man 2 stat.

Еще одним преимуществом является большая мобильность, как указано в документации:

Примечание. Несмотря на то, что Windows поддерживает chmod(), вы можете установить для него флаг только для чтения (через константы stat.S_IWRITE и stat.S_IREAD или соответствующее целочисленное значение). Все остальные биты игнорируются.

chmod +x демонстрируется по адресу: Как вы делаете простой " chmod +x " из питона?

Протестировано в Ubuntu 16.04, Python 3.5.2.