Что означает переменная __file__/do?

A = os.path.join(os.path.dirname(__file__), '..')

B = os.path.dirname(os.path.realpath(__file__))

C = os.path.abspath(os.path.dirname(__file__))

Обычно я просто обхожусь с этим путем. Но есть причина для этих утверждений, которые определяют путь во время выполнения, и мне очень хотелось бы скрыть модуль 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__ не является подстановочным знаком, это атрибут. Двойные атрибуты и методы подчеркивания считаются "особыми" по соглашению и служат специальной цели.

http://docs.python.org/reference/datamodel.html показывает многие специальные методы и атрибуты, если не все из них.

В этом случае __file__ является атрибутом модуля (объекта модуля). В Python файл .py является модулем. Таким образом, import amodule будет иметь атрибут __file__, что означает разные вещи при различиях.

Взято из документов:

__file__ - это путь к файлу, из которого был загружен модуль, если он был загружен из файла. Атрибут __file__ отсутствует для модулей C, которые статически связаны с интерпретатором; для динамические модули, загруженные динамически из общей библиотеки, это путь к файлу разделяемой библиотеки.

В вашем случае модуль получает свой собственный атрибут __file__ в глобальном пространстве имен.

Чтобы увидеть это в действии, попробуйте:

# file: test.py

print globals()
print __file__

И запустите:

python test.py

{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__':
 'test_print__file__.py', '__doc__': None, '__package__': None}
test_print__file__.py

Ответ 3

По документации:

__file__ - это путь к файлу, из которого был загружен модуль, если он был загружен из файла. __file__ отсутствует для модулей C, которые статически связаны с интерпретатором; для модулей расширения, загружаемых динамически из общей библиотеки, это путь к файлу разделяемой библиотеки.

а также:

__file__ должен быть " __file__ " файлом, если модуль не встроен (и, следовательно, указан в sys.builtin_module_names), и в этом случае атрибут не установлен.

Ответ 4

Использование __file__ в сочетании с различными модулями os.path позволяет всем путям относиться к текущему местоположению каталога модуля. Это позволяет переносить ваши модули/проекты на другие компьютеры.

В вашем проекте вы выполните:

A = '/Users/myname/Projects/mydevproject/somefile.txt'

а затем попробуйте развернуть его на своем сервере с помощью каталога развертывания типа /home/web/mydevproject/, тогда ваш код не сможет правильно найти пути.