Обычно я просто жестко связываю их с фактическим путем. Но есть причина для этих инструкций, которые определяют путь во время выполнения, и я действительно хотел бы понять os.path модуль, чтобы я мог начать его использовать.
Переведено автоматически
Ответ 1
Когда модуль загружается из файла в Python, __file__ устанавливается его абсолютный путь. Затем вы можете использовать это с другими функциями, чтобы найти каталог, в котором находится файл.
Разбираем примеры по одному:
A = os.path.join(os.path.dirname(__file__), '..') # A is the parent directory of the directory where program resides.
B = os.path.dirname(os.path.realpath(__file__)) # B is the canonicalised (?) directory where the program resides.
C = os.path.abspath(os.path.dirname(__file__)) # C is the absolute path of the directory where the program resides.
Вы можете увидеть различные значения, возвращаемые из них, здесь:
import os print(__file__) print(os.path.join(os.path.dirname(__file__), '..')) print(os.path.dirname(os.path.realpath(__file__))) print(os.path.abspath(os.path.dirname(__file__)))
и убедитесь, что вы запускаете ее из разных мест (таких как ./text.py, ~/python/text.py и так далее), чтобы увидеть, какая разница.
Ответ 2
Я просто хочу сначала устранить некоторую путаницу. __file__ это не подстановочный знак, это атрибут. Атрибуты и методы с двойным подчеркиванием считаются "особыми" по соглашению и служат особой цели.
В данном случае __file__ является атрибутом модуля (объекта модуля). В Python .py файл - это модуль. Таким образом, import amodule будет иметь атрибут __file__, который означает разные вещи при разных обстоятельствах.
Взято из документации:
__file__ это путь к файлу, из которого был загружен модуль, если он был загружен из файла. Атрибут __file__ отсутствует для модулей C, которые статически связаны в интерпретаторе; для модулей расширения, загружаемых динамически из общей библиотеки, это путь к файлу общей библиотеки.
В вашем случае модуль обращается к своему собственному __file__ атрибуту в глобальном пространстве имен.
__file__ это путь к файлу, из которого был загружен модуль, если он был загружен из файла. Атрибут __file__ отсутствует для модулей C, которые статически связаны в интерпретаторе; для модулей расширения, загружаемых динамически из общей библиотеки, это путь к файлу общей библиотеки.
__file__ должен быть “путем” к файлу, если только модуль не встроен (и, следовательно, не указан в sys.builtin_module_names), и в этом случае атрибут не установлен.
Ответ 4
Просто добавлю сюда краткое примечание (в основном отвечающее на заголовок вопроса, а не на его описание) об изменении, которое может сбить с толку некоторых людей. Начиная с версии Python 3.4, произошло небольшое изменение в поведении __file__:
Для нее устанавливается относительный путь к модулю, в котором она используется, если этот модуль выполняется напрямую.
В противном случае для нее устанавливается абсолютный путь к файлу.
Атрибуты модуля __file__ (и связанные значения) теперь всегда должны содержать абсолютные пути по умолчанию, за единственным исключением, __main__.__file__ когда скрипт был выполнен напрямую с использованием относительного пути. (Автор Бретт Кэннон в выпуске 18416.)
Пример:
Прямой вызов модуля x и косвенный вызов модуля y:
# x.py: from pathlib import Path import y print(__file__) print(Path(__file__)) print(Path(__file__).resolve())
# y.py: from pathlib import Path print(__file__) print(Path(__file__))