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.

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


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!


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


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', ... ]

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.


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))

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'

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


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


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]))"
  )"
}

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


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


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.


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 ")


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

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


-1

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.