Como faço para encontrar a localização do meu Python diretório site-packages?

StackOverflow https://stackoverflow.com/questions/122327

  •  02-07-2019
  •  | 
  •  

Pergunta

Como posso encontrar o local do meu diretório site-packages?

Foi útil?

Solução

Existem dois tipos de site-packages diretórios, Global e por usuário .

  1. Global site-packages ( " dist-pacotes ") diretórios estão listados na sys.path quando você executar:

    python -m site
    

    Para um mais conciso getsitepackages lista correr a partir da módulo em código Python:

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

    Nota: Com virtualenvs getsitepackages não está disponível , sys.path de cima irá listar diretório site-packages do virtualenv corretamente, apesar de tudo.

  2. O por usuário diretório site-packages ( PEP 370 ) é onde Python instala seus pacotes locais:

    python -m site --user-site
    

    Se isso aponta para um diretório inexistente verificar o status de saída do Python e ver python -m site --help explicações.

    Dica:. Running pip list --user ou pip freeze --user dá-lhe uma lista de todos os por usuário site-packages instalados


Dicas práticas

  • <package>.__path__ permite identificar a localização (s) de um pacote específico: ( )

    $ 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: ( )

    $ python3 -c "import os as _; print(_.__file__)"
    /usr/lib/python3.6/os.py
    
  • Executar pip show <package> para mostrar informações de pacotes Debian-style:

    $ 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
    

Outras dicas

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

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

A partir "Como instalar Django" documentação (embora este é útil para mais do que apenas a instalação Django) - execute o seguinte a partir do shell:

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

formatado para facilitar a leitura (em vez de uso como um one-liner), que se parece com o seguinte:

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

Para o Ubuntu ,

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

... não é correto.

Ele irá apontar-lhe /usr/lib/pythonX.X/dist-packages

Esta pasta contém apenas pacotes seu sistema operativo instalou automaticamente para os programas a serem executados.

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

A segunda pasta é provavelmente o mais útil se o caso de uso está relacionado à instalação ou lendo o código-fonte.

Se você não usar o Ubuntu, provavelmente você está seguro copiar-colar a primeira caixa de código para o terminal.

Isto é o que funcionou para mim:

python -m site --user-site

Vamos dizer que você tem instalado o pacote 'Django'. importar e escreva na dir (Django). Ela vai mostrar, todas as funções e atributos com esse 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 a mesma coisa se você tiver instalado mercurial.

Esta é para o Snow Leopard. Mas eu acho que deve funcionar em geral, bem.

Como outros já mencionado, distutils.sysconfig tem as configurações relevantes:

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

... embora o site.py padrão faz 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-python e adiciona ambos os caminhos para sys.exec_prefix bem, deve essa constante ser diferente).

Dito isso, qual é o contexto? Você não deveria estar brincando com seu site-packages diretamente; setuptools / distutils vai trabalhar para a instalação, e seu programa pode ser executado em um virtualenv onde seu PYTHONPATH é completamente local, pelo usuário, de modo que não deve assumir uso do sistema de site-packages directamente quer.

Os pacotes do sistema nativos instalados com a instalação python em sistemas baseados em Debian pode ser encontrada em:

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

Em 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 pip pode ser encontrada em:

/ usr / local / bin /

Ou pode simplesmente escrever o seguinte comando para listar todos os caminhos onde os pacotes Python são.

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

Nota: a localização pode variar de acordo com seu sistema operacional, como em 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']

Todas as respostas (ou: a mesma resposta repetida uma e outra) são inadequadas. O que você quer fazer é esta:

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 mostra final que o dir de instalação. Funciona em Ubuntu, enquanto que as que estão acima não. Não me pergunte sobre janelas ou outras dists, mas já que é o mesmo dir exata que easy_install usa por padrão, é provavelmente correto em todos os lugares onde easy_install obras (assim, em todos os lugares, até mesmo MACS). Diverta-se. Nota:. Código original tem muitos palavrões nele

Uma nota lateral: A solução proposta (distutils.sysconfig.get_python_lib()) não funciona quando há mais de um diretório site-packages (como recomendado por este artigo ). Ele só irá retornar o diretório principal do site-packages.

Infelizmente, eu não tenho nenhuma solução melhor tanto. Python não parece manter o controle de site-packages diretórios, apenas os pacotes dentro deles.

Isso funciona para mim. Ele vai te ambos dist-pacotes e pastas site-packages. Se a pasta não está no caminho do Python, não será fazendo-lo muito bom 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']

Uma nota adicional para a função get_python_lib já mencionado: em algumas plataformas diferentes diretórios são utilizados para módulos específicos da plataforma (por exemplo: módulos que exigem compilação). Se você passar plat_specific=True para a função que você obter os pacotes de sites para pacotes de plataforma específicos.

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

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

Para alterar dir para o site de pacotes dir eu uso o seguinte apelido (em sistemas * nix):

alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
from distutils.sysconfig import get_python_lib
print get_python_lib()

Uma maneira stdlib moderna está usando sysconfig módulo, disponível na versão 2.7 e 3.2+. Python atualmente usa oito caminhos ( docs ):

  • stdlib :. Diretório contendo os arquivos da biblioteca padrão do Python que não são específicos de plataforma
  • platstdlib :. Diretório contendo os arquivos da biblioteca padrão do Python que são específicos de plataforma
  • platlib :. Diretório para site específico do, arquivos específicos de plataforma
  • purelib :. Diretório para site específico do, arquivos específicos não-plataforma
  • incluir :. Diretório para arquivos de cabeçalho não-específicos da plataforma
  • platinclude :. Diretório para arquivos de cabeçalho específicos de plataforma
  • roteiros :. Diretório para arquivos de script
  • dados :. Diretório para arquivos de dados

Na maioria dos casos, os usuários encontrar esta questão estaria interessado no caminho 'purelib' (em alguns casos , você talvez possa estar interessado em 'platlib' também). Ao contrário da resposta atualmente aceita, este método não deve se comportar mal, dependendo se você tem ou não um virtualenv ativada.

Ao nível do sistema (isto é 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ê vai obter algo como isto

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

Um shell script também está disponível para exibir esses detalhes, que podem ser chamados por meio da execução sysconfig como um módulo:

python -m sysconfig

Nota: sysconfig ( fonte ) não deve ser confundido com o sub-módulo distutils.sysconfig ( fonte) mencionado em várias outras respostas aqui. Isso é um módulo totalmente diferente e que está faltando a função get_paths discutido acima.

pip show vai dar todos os detalhes sobre um pacote: https://pip.pypa.io/en/stable/reference/pip_show/ [pip show] [1]

Para obter o local:

pip show <package_name>| grep Location

A resposta à pergunta de idade. Mas usar ipython para isso.

pip install ipython
ipython 
import imaplib
imaplib?

Isto vai dar o seguinte resultado 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

Eu tinha que fazer algo um pouco diferente para um projeto que eu estava trabalhando em: encontrar o relação site-packages diretório em relação à base instalar prefixo. Se a pasta site-packages estava em /usr/lib/python2.7/site-packages, eu queria a parte /lib/python2.7/site-packages. Eu, na verdade, sistemas encontrou onde site-packages estava em /usr/lib64, e a resposta aceita não funcionou nesses sistemas.

Semelhante a resposta de trapaceiro, minha solução espreita profunda para as entranhas do Distutils, para encontrar o caminho que realmente se passou em torno dentro setup.py. Foi uma dor de descobrir que eu não quero que ninguém nunca tem que descobrir isso novamente.

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-packages ou /lib/python3.6/site-packages.

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

Python 2

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

Python 3

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

Se ele já estiver adicionado ao PYTHONPATH você também pode fazer algo como

import sys
print('\n'.join(sys.path))
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top