Como encontro a localização das fontes do módulo Python?

481

Como aprendo onde o arquivo de origem para um determinado módulo Python está instalado? O método é diferente no Windows e no Linux?

Estou tentando procurar a fonte do datetimemódulo em particular, mas também estou interessado em uma resposta mais geral.

Daryl Spitzer
fonte

Respostas:

375

Para um módulo python puro, você pode encontrar a fonte olhando themodule.__file__. O módulo datetime, no entanto, é escrito em C e, portanto, datetime.__file__aponta para um arquivo .so (não existe datetime.__file__no Windows) e, portanto, você não pode ver a fonte.

Se você baixar um tarball de origem python e extraí-lo, o código dos módulos pode ser encontrado no subdiretório Módulos .

Por exemplo, se você deseja encontrar o código de data e hora para o python 2.6, pode ver

Python-2.6/Modules/datetimemodule.c

Você também pode encontrar a versão mais recente do Mercurial na Web em https://hg.python.org/cpython/file/tip/Modules/_datetimemodule.c

Moe
fonte
Se você editar sua resposta para indicar que datetime .__ file__ aponta para .so no Linux e Mac OS X (embora no Windows o objeto do módulo datetime não tenha nenhum atributo de arquivo ), aceitarei sua resposta.
Daryl Spitzer
Na verdade, no Windows (pelo menos na versão que estou usando), o datetime simplesmente não possui um atributo de arquivo .
Daryl Spitzer
221

A execução python -vna linha de comando deve informar o que está sendo importado e de onde. Isso funciona para mim no Windows e no Mac OS X.

C:\>python -v
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# C:\Python24\lib\site.pyc has bad mtime
import site # from C:\Python24\lib\site.py
# wrote C:\Python24\lib\site.pyc
# C:\Python24\lib\os.pyc has bad mtime
import os # from C:\Python24\lib\os.py
# wrote C:\Python24\lib\os.pyc
import nt # builtin
# C:\Python24\lib\ntpath.pyc has bad mtime
...

Não sei ao certo quais são esses momentos ruins na minha instalação!

jblocksom
fonte
8
Legal! Você também pode digitar sua própria declaração de importação específica depois que ela se abrir no modo interativo para ver de onde vem a lib específica.
scorpiodawg 19/07/12
3
Onde estão os built-inmódulos?
Loretoparisi
120

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.pathe procurar você mesmo, etc. (a menos que você precise ser compatível com versões anteriores a 2.1).

É o inspectmódulo - em particular, getfileou 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 .pycpara .pyarquivos; lidar com arquivos .zip, ovos e pacotes de módulos; tentando maneiras diferentes de obter o caminho para .so/ .pydarquivos 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 .soou , 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.sofoo.cfoomodule.c

abarnert
fonte
3
Por que o __file__não é aplicável a não integrados? Entendo onde o rastreamento do sys.path pode ser doloroso (especialmente sem saber sobre o meta_path), mas a sua preocupação com o namespacing entre __file__definições e binários?
1
Eu faço isso no 2.7.8 no datetime e apenas recebo um TypeError para o getfile e o getsourcefile. Pessoalmente, tenho várias versões do python instaladas e preciso saber QUAL versão do datetimemodule.c está apontada, porque agora eu sei que não está apontada para a que deve ser apontada, dada a versão do interpretador que está sendo executada ...
mmitchell
1
@mmitchell: Se você está recebendo um TypeError do inspect.getfile (datetime), supondo que datetime seja realmente o módulo e não algo que você tenha atribuído ao mesmo nome, tenho certeza que isso significa que você fez uma compilação personalizada para vincular estaticamente no datetime ao intérprete, em vez de torná-lo um módulo carregável. Mas poderia haver outras razões em que não pensei. Você precisa fazer uma nova pergunta e fornecer muito mais informações para reproduzir isso.
abarnert
@mmitchell: Enquanto isso, não há como descobrir para qual versão do datetimemodule.c está apontando, porque não está apontando para datetimemodule.c, está apontando para um módulo compilado construído a partir desse arquivo C; o arquivo C pode não existir no seu sistema, pode ter sido editado desde que você o compilou, o que seja.
abarnert
@ Tristan: Não sei se entendi o que você está perguntando, mas talvez isso responda: sempre que __file__funciona, inspect.getfilefunciona; não há situação em que adivinhar se __file__será melhor do que apenas usar o módulo de inspeção.
abarnert
67

A sys.pathlista contém a lista de diretórios que serão pesquisados ​​por módulos em tempo de execução:

python -v
>>> import sys
>>> sys.path
['', '/usr/local/lib/python25.zip', '/usr/local/lib/python2.5', ... ]
Greg Hewgill
fonte
10
python -c 'import sys; print "\n".join(sys.path)'permitirá que você veja sem ter que usar o python interativo.
Joe Block
6
Python 3:python -c 'import sys; print("\n".join(sys.path))'
arudzinska 13/09/18
61

Se você estiver usando o pip para instalar seus módulos, apenas pip show $moduleo local será retornado.

James Mark Mackenzie
fonte
10
(Acho que $modulefoi concebido como uma variável espaço reservado, não literalmente o que se digita Por exemplo,. m=numpy; pip show $m... etc, para qualquer m)
michael
isso deve ser marcado como a resposta mais precisa para a pergunta.
Rahul Goyal
37

da biblioteca padrão, tente imp.find_module

>>> import imp
>>> imp.find_module('fontTools')
(None, 'C:\\Python27\\lib\\site-packages\\FontTools\\fontTools', ('', '', 5))
>>> imp.find_module('datetime')
(None, 'datetime', ('', '', 6))
Com código
fonte
1
Isto é fantástico. Eu tinha apt-get removeo DataDog e ainda podia importá-lo. Isso me ajudou a encontrar onde estavam os arquivos (para que eu pudesse excluí-los) quando as outras soluções não ajudaram.
sg
para python3.x, o imppacote é preterido (uma vez que a versão 3.4) em favor do importlib(desde 3,1) docs.python.org/3.6/library/imp.html
Michael
Agora você precisa usá-lo dessa maneira para python3. import importlibentãoimportlib.util.find_spec('fontTools')
Medhat 28/01
33

datetime é um módulo interno, portanto, não há arquivo de origem (Python).

Para módulos provenientes de .py(ou .pyc) arquivos, você pode usar mymodule.__file__, por exemplo,

> import random
> random.__file__
'C:\\Python25\\lib\\random.pyc'
Bjarke Ebert
fonte
12

No interpretador python, você pode importar o módulo específico e digitar help (módulo). Isso fornece detalhes como Nome, Arquivo, Documentos do módulo, Descrição e outros.

Ex:

import os

help(os)


Help on module os:

NAME

os - OS routines for Mac, NT, or Posix depending on what system we're on.

FILE

/usr/lib/python2.6/os.py

MODULE DOCS

http://docs.python.org/library/os

DESCRIPTION

This exports:

- all functions from posix, nt, os2, or ce, e.g. unlink, stat, etc.

- os.path is one of the modules posixpath, or ntpath

- os.name is 'posix', 'nt', 'os2', 'ce' or 'riscos'

et al

Vijay
fonte
Isso me deu um caminho completo para o arquivo do módulo, enquanto outras respostas deram apenas caminhos relativos. Obrigado.
Jerther 10/03
12

Aqui está uma lista para obter o nome do arquivo para um módulo, adequado para aliasing de shell:

echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)'  | python - 

Configure como um alias:

alias getpmpath="echo 'import sys; t=__import__(sys.argv[1],fromlist=[\".\"]); print(t.__file__)'  | python - "

Usar:

$ getpmpath twisted
/usr/lib64/python2.6/site-packages/twisted/__init__.pyc
$ getpmpath twisted.web
/usr/lib64/python2.6/site-packages/twisted/web/__init__.pyc
Ernest
fonte
9

Confira este comando bacana "cdp" para cd no diretório que contém a fonte do módulo Python indicado:

cdp () {
  cd "$(python -c "import os.path as _, ${1}; \
    print _.dirname(_.realpath(${1}.__file__[:-1]))"
  )"
}
Daryl Spitzer
fonte
Obrigado! É exatamente o que eu estava procurando. Por estranho que pareça, eles não incluiriam algo desse tipo na distribuição python.
Antony Hatchkins
9

No Windows, você pode encontrar a localização do módulo python, como mostrado abaixo: ou seja, encontrar o módulo rest_framework insira a descrição da imagem aqui

Dun0523
fonte
4

No Ubuntu 12.04, por exemplo, numpy package for python2, pode ser encontrado em:

/usr/lib/python2.7/dist-packages/numpy

Obviamente, essa não é uma resposta genérica

nexayq
fonte
0

Nem todos os módulos python são escritos em python. Datetime é um deles que não é, e (no linux) é datetime.so.

Você precisaria fazer o download do código-fonte na biblioteca padrão do python para acessá-lo.

JimB
fonte
2
Daryl: Você analisou incorretamente a resposta de Jim: "Datetime é um dos módulos python não escritos em python".
Matthew Trevor
0

Para aqueles que preferem uma solução gráfica: se você estiver usando uma interface gráfica como o Spyder (parte da instalação do Anaconda), clique com o botão direito do mouse no nome do módulo (como "csv" em "import csv") e selecione "ir" para definição "- isso abrirá o arquivo, mas também na parte superior você pode ver o local exato do arquivo (" C: .... csv.py ")

Alona
fonte
0

Se você não estiver usando o intérprete, poderá executar o código abaixo:

import site
print (site.getsitepackages())

Resultado:

['C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37', 'C:\\Users\\<your username>\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages']

O segundo elemento na matriz será o local do seu pacote. Nesse caso:

C:\Users\<your username>\AppData\Local\Programs\Python\Python37\lib\site-packages
sudhee
fonte
0

Outra maneira de verificar se você tem várias versões python instaladas, a partir do terminal.

-MBP: ~ python3 -m pip mostra pyperclip

Local: /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-

MBP: ~ python -m pip mostra pyperclip

Local: /Users/umeshvuyyuru/Library/Python/2.7/lib/python/site-packages

u_v
fonte
-1

Em um IDE como o Spyder, importe o módulo e execute-o individualmente. insira a descrição da imagem aqui

Anirudh Sharma
fonte
Importar e imprimir o str()modelo é uma descrição mais precisa do que você está fazendo na captura de tela, além do IDE parecer irrelevante para esta solução
ratoeira
2
Bem-vindo ao StackOverflow! Por favor, não poste código usando imagens. As imagens são difíceis de ler, não podem ser pesquisadas e não são visíveis para alguns leitores. Em vez disso, inclua qualquer código relevante diretamente no corpo da sua resposta.
Brian