что означает переменная __file__ / делает? - PullRequest
124 голосов
/ 14 февраля 2012
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, чтобы я мог начать использовать его.

Ответы [ 4 ]

117 голосов
/ 14 февраля 2012

Когда модуль загружается в 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 и т. Д.), Чтобы увидеть, какое это имеет значение.

46 голосов
/ 14 февраля 2012

Я просто хочу сначала решить некоторую путаницу. __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
21 голосов
/ 14 февраля 2012

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

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

и также :

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

10 голосов
/ 14 февраля 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...