Что означает переменная __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/
, тогда ваш код не сможет правильно найти пути.