Я понимаю, что этот ответ опоздал на 4 года, но существующие ответы вводят людей в заблуждение.
Правильный способ сделать это - никогда __file__
, или пытаться пройти через sys.path
, искать себя и т. Д. (Если только вам не требуется обратная совместимость после 2.1).
Это модуль inspect
, в частности, getfile
или getsourcefile
.
Если вы не хотите изучать и реализовывать правила (которые задокументированы, но болезненны для CPython 2.x и совсем не документированы для других реализаций или 3.x) для сопоставления .pyc
с .py
файлами ; работа с архивами .zip, яйцами и пакетами модулей; пробовать разные способы получить путь к .so
/ .pyd
файлам, которые не поддерживают __file__
; выяснить, что делают Jython / IronPython / PyPy; и т.д. В таком случае, пойти на это.
Между тем, каждый источник Python версии 2.0+ доступен онлайн по адресу http://hg.python.org/cpython/file/X.Y/
(например, 2.7 или 3.3 ). Итак, когда вы обнаружите, что inspect.getfile(datetime)
- это файл .so
или .pyd
, такой как /usr/local/lib/python2.7/lib-dynload/datetime.so
, вы можете найти его в каталоге Modules. Строго говоря, нет никакого способа быть уверенным в том, какой файл определяет какой модуль, но почти все они являются foo.c
или foomodule.c
, поэтому нетрудно догадаться, что datetimemodule.c это то, что вы хотите.