Respostas:
Existem dois tipos de diretórios de pacotes de sites, global e por usuário .
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"])'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 .
<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.pyExecute 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, pluggypython -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"(funciona também no Python 2 e 3).
python -c "import site; print(site.getsitepackages()[0])"
>>> 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])
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].
Uma solução que:
... é 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)
cdsitepackages, para mudar diretamente para o diretório de pacotes de sites do ambiente.
/usr/lib/python3/dist-packagesvez de /usr/lib/python3.5/dist-packages.
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.
module.__file__é o melhor caminho. Se eles estão tentando instalar coisas ... basta usar as ferramentas.
'/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
dist-packagesno (L) Ubuntu.
Isto é o que funcionou para mim:
python -m site --user-site
~/.local/lib/python2.7/site-packages).
virtualenv, reclama que o pacote não existe. como invoco os pacotes instalados em um local personalizado?
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.
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).
foo.barpacote:python -c "import foo.bar as _; print(_.__path__[0])"
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.
python2osx e ubuntu com e sem virtualenv, mas não com python3nada.
python3.
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
platlib, como por exemplo /usr/local/lib/python3.6/site-packages? Tradicionalmente, as coisas instaladas localmente devem entrar /usr/local.
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']
site.getsitepackages()partir da instalação do sistema, portanto, os pacotes dist, outras instalações mostrarão pacotes do site.
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.
easy_installe não falhar normalmente se não estiver disponível que é inadequado :)
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.
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 .
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']
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'
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.
from distutils.sysconfig import get_python_lib
print get_python_lib()
O pip show fornecerá todos os detalhes sobre um pacote: https://pip.pypa.io/en/stable/reference/pip_show/ [pip show] [1]
Para obter a localização:
pip show <package_name>| grep Location
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
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.
pip show <package name>