Como faço para encontrar a localização do meu Python diretório site-packages?
-
02-07-2019 - |
Pergunta
Como posso encontrar o local do meu diretório site-packages?
Solução
Existem dois tipos de site-packages diretórios, Global e por usuário .
-
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. -
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
oupip 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))