Sei que esta resposta está atrasada 4 anos, mas as respostas existentes são pessoas enganosas.
A maneira correta de fazer isso é nunca __file__
, ou tentar percorrer sys.path
e procurar você mesmo, etc. (a menos que você precise ser compatível com versões anteriores a 2.1).
É o inspect
módulo - em particular, getfile
ou getsourcefile
.
A menos que você queira aprender e implementar as regras (que são documentadas, mas dolorosas, para o CPython 2.xe não são documentadas para outras implementações, ou 3.x) para mapear .pyc
para .py
arquivos; lidar com arquivos .zip, ovos e pacotes de módulos; tentando maneiras diferentes de obter o caminho para .so
/ .pyd
arquivos que não suportam __file__
; descobrir o que o Jython / IronPython / PyPy faz; etc. Nesse caso, vá em frente.
Enquanto isso, a fonte de todas as versões Python do 2.0+ está disponível online em http://hg.python.org/cpython/file/X.Y/
(por exemplo, 2.7 ou 3.3 ). Assim, depois de descobrir que inspect.getfile(datetime)
é um arquivo .so
ou , você pode procurá-lo dentro do diretório Modules. Estritamente falando, não há como ter certeza de qual arquivo define qual módulo, mas quase todos são ou , portanto, não deve ser difícil adivinhar que datetimemodule.c é o que você deseja..pyd
/usr/local/lib/python2.7/lib-dynload/datetime.so
foo.c
foomodule.c