Когда модуль загружается из файла в 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
и т. д.), чтобы увидеть, что это меняет.
__file__
НЕ определяется во всех случаях, например, статически связанные модули C. Мы не можем рассчитывать на__file__
постоянную доступность.name '__file__' is not defined
.__file__
путь к файлу, из которого был загружен модуль, если он был загружен из файла. Это означает, что__file__
будет работать только тогда, когда вы запускаете его как скрипт, а не в интерпретаторе. (Если вы не импортируете его в интерпретатор ...)Я просто хочу сначала устранить некоторую путаницу.
__file__
это не подстановочный знак, это атрибут. Атрибуты и методы двойного подчеркивания считаются «специальными» по соглашению и служат специальной цели.http://docs.python.org/reference/datamodel.html показывает многие специальные методы и атрибуты, если не все.
В данном случае
__file__
это атрибут модуля (объект модуля). В Python.py
файл является модулем. Такimport amodule
будет иметь атрибут,__file__
который означает разные вещи в разных обстоятельствах.Взято из документов:
В вашем случае модуль обращается к своему
__file__
атрибуту в глобальном пространстве имен.Чтобы увидеть это в действии, попробуйте:
И запустить:
источник
Согласно документации :
а также :
источник
Использование в
__file__
сочетании с различнымиos.path
модулями позволяет всем путям относиться к местоположению каталога текущего модуля. Это позволяет переносить ваши модули / проекты на другие машины.В своем проекте вы делаете:
а затем попытайтесь развернуть его на своем сервере с помощью каталога развертываний, подобного
/home/web/mydevproject/
которому ваш код не сможет правильно найти пути.источник