Como encontro a localização do meu diretório de pacotes de sites Python?

942

Como encontro a localização do meu diretório de pacotes de sites?

Daryl Spitzer
fonte
63
Se você quer apenas a localização exata de um pacote, então você pode usarpip show <package name>
joshuakcockrell

Respostas:

532

Existem dois tipos de diretórios de pacotes de sites, global e por usuário .

  1. Os diretórios globais site-packages (" dist-packages ") são listados sys.pathquando você executa:

    python -m site

    Para uma lista mais concisa, execute getsitepackageso módulo do site no código Python:

    python -c 'import site; print(site.getsitepackages())'

    Nota: Com o virtualenvs, o getsitepackages não está disponível , mas a sys.pathpartir de cima listará o diretório de pacotes de sites do virtualenv corretamente. No Python 3, você pode usar o módulo sysconfig :

    python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'
  2. O diretório de pacotes de sites por usuário ( PEP 370 ) é onde o Python instala seus pacotes locais:

    python -m site --user-site

    Se isso apontar para um diretório inexistente, verifique o status de saída do Python e veja python -m site --helpexplicações.

    Dica: executando pip list --userou pip freeze --userfornece uma lista de todos os pacotes de sites instalados por usuário .


Dicas Práticas

  • <package>.__path__permite identificar os locais de um pacote específico: ( detalhes )

    $ python -c "import setuptools as _; print(_.__path__)"
    ['/usr/lib/python2.7/dist-packages/setuptools']
  • <module>.__file__permite identificar a localização de um módulo específico: ( diferença )

    $ python3 -c "import os as _; print(_.__file__)"
    /usr/lib/python3.6/os.py
  • Execute pip show <package>para mostrar as informações do pacote no estilo Debian:

    $ pip show pytest
    Name: pytest
    Version: 3.8.2
    Summary: pytest: simple powerful testing with Python
    Home-page: https://docs.pytest.org/en/latest/
    Author: Holger Krekel, Bruno Oliveira, Ronny Pfannschmidt, Floris Bruynooghe, Brianna Laugher, Florian Bruhin and others
    Author-email: None
    License: MIT license
    Location: /home/peter/.local/lib/python3.4/site-packages
    Requires: more-itertools, atomicwrites, setuptools, attrs, pathlib2, six, py, pluggy
Peterino
fonte
17
existe um diretório de pacotes de sites em um virtualenv. Você pode obter o diretório para módulos específicos do site dentro / fora do virtualenv usando python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"(funciona também no Python 2 e 3).
jfs
4
Agradável. E para obter o primeiro:python -c "import site; print(site.getsitepackages()[0])"
Brent Faust
2
Isso deve estar em qualquer tutorial básico sobre o uso de python. Eu venho fazendo pythoning há anos e não sabia sobre o módulo do site. Teria poupado tantas dores de cabeça ...
salotz 18/10/19
1
Sugeri uma alteração no tutorial oficial do Python. Consulte o PR # 16974 para obter detalhes e obrigado pela sugestão @salotz!
Peterino 6/11/19
1
Acho que stackoverflow.com/a/52638888/1365918 é facilmente a melhor resposta para esta pergunta.
kapad 11/02
652
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

(ou apenas o primeiro item com site.getsitepackages()[0])

eudoxos
fonte
17
Isso é bom, mas, infelizmente, essa função está disponível apenas no python2.7. Então, boa solução se você estiver usando python2.7 ou acima, mas não funciona para Python 2.6 e abaixo
Dan Niero
15
python -c "site de importação; print (site.getsitepackages ())"
Lars Schneider
29
Eu recebo AttributeError: o objeto 'module' não tem atributo 'getsitepackages' ao usar com o virtualenv (python 2.7.8), mas a solução distutils abaixo funciona.
Radtek
8
@radtek: para venv de, eu detectar venv via hasattr(sys,'real_prefix')e então determinar os pacotes do site heuristically de [p for p in sys.path if p.endswith('site-packages')][-1](mais verificar se há encontrado antes de fazer os [-1].
Eudoxo
4
@radtek É um bug conhecido que o módulo local não funciona para virtualenv github.com/pypa/virtualenv/issues/355
Guillem Cucurull
319

Uma solução que:

  • fora do virtualenv - fornece o caminho dos pacotes globais de sites,
  • insidue a virtualenv - fornece os pacotes de sites do virtualenv

... é esta linha:

python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"

Formatado para facilitar a leitura (em vez de usar como uma linha), que se parece com o seguinte:

from distutils.sysconfig import get_python_lib
print(get_python_lib())


Fonte: uma versão muito antiga da documentação "Como instalar o Django" (embora isso seja útil para mais do que apenas a instalação do Django)

Daryl Spitzer
fonte
1
O virtualenv fornece uma maneira de encontrar seus pacotes de sites?
Daryl Spitzer
10
Você pode usar o virtualenvwrapper, que possui o comando cdsitepackages, para mudar diretamente para o diretório de pacotes de sites do ambiente.
10132 john2x
6
@PiotrDobrogost: funciona para mim no Python 2.7 em um virtualenv no Linux
RichVel 6/13
2
O primeiro comentário não se aplica mais: isso mostrou a localização correta tanto fora quanto dentro de um virtualenv.
astrojuanlu
2
Não funcionou para mim no Windows 10 usando o Linux bash, ele retorna em /usr/lib/python3/dist-packagesvez de /usr/lib/python3.5/dist-packages.
Delgan
99

Para o Ubuntu ,

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"

... não está correto.

Isso apontará para você /usr/lib/pythonX.X/dist-packages

Esta pasta contém apenas pacotes que seu sistema operacional instalou automaticamente para a execução de programas.

No ubuntu , a pasta site-packages que contém os pacotes instalados via setup_tools \ easy_install \ pip estará em/usr/local/lib/pythonX.X/dist-packages

A segunda pasta é provavelmente a mais útil se o caso de uso estiver relacionado à instalação ou leitura do código-fonte.

Se você não usa o Ubuntu, provavelmente está colando com segurança a primeira caixa de código no terminal.

David Hollander
fonte
3
Se o solicitante estiver atrás da localização de um pacote específico, module.__file__é o melhor caminho. Se eles estão tentando instalar coisas ... basta usar as ferramentas.
Tobu
'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages()no Ubuntu (apesar de ser posterior /usr/local/... na lista). Você só entra na /usr/localvia sudo pipe não deve usar sudo pipno Ubuntu, a menos que tenha decidido fazer sua própria distribuição: se você usar sudo pip, é sua responsabilidade garantir que todas as dependências dos módulos python atuais e futuros instalados via sudo aptou sudo pipsejam compatíveis. Considere o problema que virtualenvfoi criado para resolver
jfs
Explicação clara para entender as diferenças do 2 dist-packagesno (L) Ubuntu.
Timo
69

Isto é o que funcionou para mim:

python -m site --user-site
Ramashri
fonte
15
Para mim, isso aponta para uma pasta que nem existe ( ~/.local/lib/python2.7/site-packages).
Neil Traft
1
mesmo, no OS X Mavericks, minha casa .local não é o que eu queria que encontrasse e sim, não está realmente lá.
Radtek
Sua em minha principal / Library pasta que eu tinha que manualmente navegar a ele, por algum motivo, o caminho completo direta não estava funcionando
efwjames
como uso os pacotes instalados aqui? se eu fizer virtualenv, reclama que o pacote não existe. como invoco os pacotes instalados em um local personalizado?
AbtPst
2
Isso indica onde o Python procurará pacotes específicos do usuário. Comentários como "nem sequer existem" e "não é o que eu queria que encontrassem" não fazem sentido nesse contexto.
Honest Abe
28

Digamos que você instalou o pacote 'django'. importe-o e digite dir (django). Ele mostrará todas as funções e atributos desse módulo. Digite o interpretador python -

>>> import django
>>> dir(django)
['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'get_version']
>>> print django.__path__
['/Library/Python/2.6/site-packages/django']

Você pode fazer o mesmo se tiver instalado o mercurial.

Isto é para o Snow Leopard. Mas acho que também deve funcionar em geral.

Sumod
fonte
>>> import pg >>> print pg .__ path__ Traceback (última chamada mais recente): Arquivo "<stdin>", linha 1, em <module> AttributeError: 'module' objeto não possui atributo ' path '
Dannid
funciona, preciso encontrar o pacote sklearn para adicionar ao caminho PYDEV, obrigado.
berkay
use django.__file__para isso ao invés de __path__. e, não, não é uma garantia de que isso tenha algo a ver com pacotes do site, mas com coisas como django, que você provavelmente instalou com o pip , isso acontecerá quando você estiver com pressa e puder ser usado para outros propósitos também (lendo um arquivo de configuração padrão do sistema de arquivos, por exemplo).
JL Peyret
Com base nesta e em outras respostas, você pode fazer isso em uma linha a partir da linha de comando para obter o caminho para o seu foo.barpacote:python -c "import foo.bar as _; print(_.__path__[0])"
snark
23

Como outros observaram, distutils.sysconfigpossui as configurações relevantes:

import distutils.sysconfig
print distutils.sysconfig.get_python_lib()

... embora o padrão site.pyfaça algo um pouco mais bruto, parafraseado abaixo:

import sys, os
print os.sep.join([sys.prefix, 'lib', 'python' + sys.version[:3], 'site-packages'])

(ele também adiciona ${sys.prefix}/lib/site-pythone adiciona os dois caminhos sys.exec_prefixtambém, caso essa constante seja diferente).

Dito isto, qual é o contexto? Você não deveria estar mexendo com o seu site-packagesdiretamente; O setuptools / distutils funcionará para a instalação, e seu programa pode estar sendo executado em um ambiente virtual em que o pythonpath é completamente local do usuário, portanto, não deve assumir o uso dos pacotes de sites do sistema diretamente.

Charles Duffy
fonte
3
funciona de maneira confiável com python2osx e ubuntu com e sem virtualenv, mas não com python3nada.
jitter
2
2008 foi um tempo atrás - essa resposta foi três meses antes do lançamento do Python 3.0.
Charles Duffy
com certeza, mas hoje meu comentário pode ajudar. me corrija se estiver errado. além disso, eu não votei esta resposta ou qualquer outra em relação a python3.
jitter
22

Uma maneira moderna de stdlib está usando o sysconfigmódulo, disponível nas versões 2.7 e 3.2+.

Nota : sysconfig( fonte ) não deve ser confundida com o distutils.sysconfigsubmódulo ( fonte ) mencionado em várias outras respostas aqui. O último é um módulo totalmente diferente e não possui a get_pathsfunção discutida abaixo.

Atualmente, o Python usa oito caminhos ( docs ):

  • stdlib : diretório que contém os arquivos de biblioteca padrão do Python que não são específicos da plataforma.
  • platstdlib : diretório que contém os arquivos de biblioteca padrão do Python específicos da plataforma.
  • platlib : diretório para arquivos específicos do site e específicos da plataforma.
  • purelib : diretório para arquivos específicos do site e não da plataforma.
  • include : diretório para arquivos de cabeçalho não específicos da plataforma.
  • platinclude : diretório para arquivos de cabeçalho específicos da plataforma.
  • scripts : diretório para arquivos de script.
  • data : diretório para arquivos de dados.

Na maioria dos casos, os usuários que encontrarem essa pergunta estariam interessados ​​no caminho 'purelib' (em alguns casos , você também pode estar interessado em 'platlib'). Diferentemente da resposta atual aceita, esse método ainda funciona independentemente de você ter ou não um virtualenv ativado.

No nível do sistema (este é Python 3.7.0 no mac OS):

>>> import sysconfig
>>> sysconfig.get_paths()['purelib']
'/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages'

Com um venv, você terá algo parecido com isto

>>> import sysconfig
>>> sysconfig.get_paths()['purelib']
'/private/tmp/.venv/lib/python3.7/site-packages'

Um script de shell também está disponível para exibir esses detalhes, que você pode chamar executando sysconfigcomo um módulo:

python -m sysconfig
wim
fonte
Esta é uma ótima resposta, estou feliz que o novo módulo sysconfig torne isso mais fácil. Existe uma maneira de obter o prefixo local platlib, como por exemplo /usr/local/lib/python3.6/site-packages? Tradicionalmente, as coisas instaladas localmente devem entrar /usr/local.
Eudoxo
Facilmente a melhor resposta para esta pergunta! Obrigado. A única coisa que achei ausente foi a ordem em que esses locais são verificados quando uma declaração de importação é encontrada. Além disso, algum desses locais é pré-pesquisado / armazenado em cache quando o python é carregado? Saber que isso também seria útil para a IMO.
kapad 11/02
21

Os pacotes do sistema nativo instalados com a instalação python em sistemas baseados no Debian podem ser encontrados em:

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

No OSX - /Library/Python/2.7/site-packages

usando este pequeno código:

from distutils.sysconfig import get_python_lib
print get_python_lib()

No entanto, a lista de pacotes instalados via pippode ser encontrada em:

/ usr / local / bin /

Ou pode-se simplesmente escrever o seguinte comando para listar todos os caminhos onde estão os pacotes python.

>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

Nota: a localização pode variar com base no seu sistema operacional, como no OSX

>>> import site; site.getsitepackages()
['/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/site-python', '/Library/Python/2.7/site-packages']
fnatic_shank
fonte
Se bem me lembro, dist-packages é específico para o Debian e derivados.
Samuel
1
@SamuelSantana você está correto. dist-packages são específicos para sistemas baseados em debian. Neste caso, invoquei a site.getsitepackages()partir da instalação do sistema, portanto, os pacotes dist, outras instalações mostrarão pacotes do site.
Fnatic_shank 23/03
15

Todas as respostas (ou: a mesma resposta repetida várias vezes) são inadequadas. O que você quer fazer é o seguinte:

from setuptools.command.easy_install import easy_install
class easy_install_default(easy_install):
  """ class easy_install had problems with the fist parameter not being
      an instance of Distribution, even though it was. This is due to
      some import-related mess.
      """

  def __init__(self):
    from distutils.dist import Distribution
    dist = Distribution()
    self.distribution = dist
    self.initialize_options()
    self._dry_run = None
    self.verbose = dist.verbose
    self.force = None
    self.help = 0
    self.finalized = 0

e = easy_install_default()
import distutils.errors
try:
  e.finalize_options()
except distutils.errors.DistutilsError:
  pass

print e.install_dir

A linha final mostra o diretório de instalação. Funciona no Ubuntu, enquanto os anteriores não. Não me pergunte sobre janelas ou outros discos, mas como é o mesmo diretório que o easy_install usa por padrão, provavelmente está correto em qualquer lugar em que o easy_install funcione (por isso, em todos os lugares, até nos macs). Diverta-se. Nota: o código original possui muitos palavrões.

trapaceiro
fonte
1
Obrigado, isso é bastante útil, no py3 com colchetes para impressão, obtém-me /usr/local/lib/python3.4/dist-packages Estou tentando descobrir como obter o /usr/lib/python3.4/dist -packages então terá que jogar mais.
Stuart Axon
4
requer biblioteca externa easy_installe não falhar normalmente se não estiver disponível que é inadequado :)
jitter
1
na verdade, isso não é perfeito, mas funcionou para mim e levou muito tempo para descobrir, então eu o coloco aqui na esperança de que alguém possa aproveitar o tempo que já gastei nele.
trapaceiro 25/05
13

Uma observação: A solução proposta ( distutils.sysconfig.get_python_lib()) não funciona quando há mais de um diretório de pacotes de sites (conforme recomendado neste artigo ). Ele retornará apenas o diretório principal de pacotes do site.

Infelizmente, também não tenho solução melhor. O Python não parece acompanhar os diretórios de pacotes de sites, apenas os pacotes dentro deles.

Vladimir Vagaytsev
fonte
1
Eu acho que essa é a razão pela qual, get_python_lib()ao ser executado no virtualenv, mostra pacotes de sites do Python usados ​​para criar virtualenv e não os pacotes de sites do virtualenv .
Piotr Dobrogost
3
@ Piotr Isso provavelmente foi um bug no distutils.sysconfig. Acabei de testar e recebo os pacotes internos do site, conforme o esperado.
Tobu
Também testado com o Python 2.7 instalado em uma virtualenv no Linux, e o método distutils.sysconfig funciona bem para obter os pacotes de sites internos do Python.
RichVel
12

Isso funciona para mim. Você receberá as pastas dist-packages e site-packages. Se a pasta não estiver no caminho do Python, não fará muito bem de qualquer maneira.

import sys; 
print [f for f in sys.path if f.endswith('packages')]

Saída (instalação do Ubuntu):

['/home/username/.local/lib/python2.7/site-packages',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages']
just_an_old_guy
fonte
2
resposta aceita é a maneira recomendada, então você deve dizer por que o seu é melhor, já que é um pouco
complicado
O que há de errado com um hack? ;) É mais simples e fácil de entender e lembrar se você estiver trabalhando interativamente.
31712
11

Isso deve funcionar em todas as distribuições dentro e fora do ambiente virtual devido à sua natureza "de baixa tecnologia". O módulo os sempre reside no diretório pai de 'site-packages'

import os; print(os.path.dirname(os.__file__) + '/site-packages')

Para alterar o diretório para o diretório de pacotes do site, eu uso o seguinte alias (nos sistemas * nix):

alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
Pyramid Newbie
fonte
10

Uma observação adicional para a get_python_libfunção já mencionada: em algumas plataformas, diretórios diferentes são usados ​​para módulos específicos da plataforma (por exemplo: módulos que requerem compilação). Se você passar plat_specific=Truepara a função, obtém os pacotes do site para pacotes específicos da plataforma.

Armin Ronacher
fonte
8
from distutils.sysconfig import get_python_lib
print get_python_lib()
Florian Bösch
fonte
3

Resposta à pergunta antiga. Mas use o ipython para isso.

pip install ipython
ipython 
import imaplib
imaplib?

Isso fornecerá a seguinte saída sobre o pacote imaplib -

Type:        module
String form: <module 'imaplib' from '/usr/lib/python2.7/imaplib.py'>
File:        /usr/lib/python2.7/imaplib.py
Docstring:  
IMAP4 client.

Based on RFC 2060.

Public class:           IMAP4
Public variable:        Debug
Public functions:       Internaldate2tuple
                        Int2AP
                        ParseFlags
                        Time2Internaldate
Sahil Agarwal
fonte
1
Este não é o diretório de pacotes do site, mas o diretório em que o pacote está instalado. Isso também é útil apenas se você estiver usando o iPython e não conseguir obter um diretório de instalação programaticamente.
Danielunderwood
3

Você deve tentar este comando para determinar o local de instalação do pip

Python 2

pip show six | grep "Location:" | cut -d " " -f2

Python 3

pip3 show six | grep "Location:" | cut -d " " -f2
ferrugem
fonte
1

Eu tinha que fazer algo um pouco diferente para um projeto que eu estava trabalhando em: encontrar o parente site-packages diretório em relação à base instalar prefixo. Se a pasta de pacotes de sites estivesse /usr/lib/python2.7/site-packages, eu queria a /lib/python2.7/site-packagesparte. De fato, encontrei sistemas onde site-packagesestava /usr/lib64, e a resposta aceita NÃO funcionou nesses sistemas.

Semelhante à resposta do trapaceiro, minha solução espreita profundamente as entranhas do Distutils, para encontrar o caminho que realmente passa por dentro setup.py. Foi uma dor de cabeça descobrir que eu não quero que ninguém tenha que descobrir isso de novo.

import sys
import os
from distutils.command.install import INSTALL_SCHEMES

if os.name == 'nt':
    scheme_key = 'nt'
else:
    scheme_key = 'unix_prefix'

print(INSTALL_SCHEMES[scheme_key]['purelib'].replace('$py_version_short', (str.split(sys.version))[0][0:3]).replace('$base', ''))

Isso deve imprimir algo como /Lib/site-packagesou /lib/python3.6/site-packages.

MultipleMonomials
fonte
-2

Se já estiver adicionado ao, PYTHONPATHvocê também pode fazer algo como

import sys
print('\n'.join(sys.path))
filtfilt
fonte