Как получить путь к файлу pyd, также известному как __file__

У меня есть файл package.py, который я пытаюсь упаковать в package.pyd. У меня есть следующее утверждение в package.py

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

который отлично работает, когда я запускаю package.py, но когда я импортирую package.pyd в другой файл wrapper.py, я получаю следующее сообщение об ошибке

Traceback (most recent call last):
  File "C:\Projects\Wrapper.py", line 1, in <module>
    import package
  File "package.py", line 40, in init package (package.c:4411)
NameError: name '__file__' is not defined

Как я могу получить местоположение файла .pyd. Также есть способ проверить, запускается ли он как .pyd или .py.

Спасибо!


person coolarm    schedule 29.11.2016    source источник


Ответы (2)


Кажется, переменная __file__ недоступна в инициализации модуля. Но вы можете получить __file__ после загрузки модуля:

def get_file():
    return __file__

Вы можете проверить переменную __file__, чтобы узнать, какой файл был загружен. Также имейте в виду порядок поиска Python: pyd (so), py, pyw(for windows), pyc.

Дополнительная информация об этом содержится в этом этом вопросе

Нашел два рабочих метода.

  1. С участием модуля inspect:

    import inspect
    import sys
    import os
    
    if hasattr(sys.modules[__name__], '__file__'):
        _file_name = __file__
    else:
        _file_name = inspect.getfile(inspect.currentframe())
    
    CURR = os.path.dirname(os.path.realpath(_file_name))
    
  2. import какой-то файл того же уровня и используя его атрибут __file__:

    import os
    from . import __file__ as _initpy_file
    CURR = os.path.dirname(os.path.realpath(_initpy_file))
    

    На самом деле, это не обязательно должен быть __init__.py модуль, вы можете добавить и импортировать любой [пустой] файл, чтобы он заработал.

person Gennady Kandaurov    schedule 29.11.2016
comment
У меня это не сработало, возможно, потому что я звоню get_file(), который, в свою очередь, пытается найти __file__. Я действительно искал обходной путь. Переменная окружения :) в файле try-except. Но я сталкиваюсь с новыми препятствиями, пытаясь преобразовать двоичные файлы .py в .pyd. Похоже, что при создании пакета .py многие вещи считаются само собой разумеющимися, что не годится при преобразовании его в .pyd. - person coolarm; 30.11.2016

__file__ теперь работает в более поздних версиях Cython (0.27 ish) при запуске в версии Python, которая поддерживает многоэтапную инициализацию модулей (Python ›=3.5). См. https://github.com/cython/cython/issues/1715 для момент, когда он был добавлен.

person Community    schedule 29.09.2020