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.path
quando você executa:
python -m site
Para uma lista mais concisa, execute getsitepackages
o 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.path
partir 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 --help
explicações.
Dica: executando pip list --user
ou pip freeze --user
fornece 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.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
python -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-packages
vez 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/local
via sudo pip
e não deve usar sudo pip
no 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 apt
ou sudo pip
sejam compatíveis. Considere o problema que virtualenv
foi criado para resolver
dist-packages
no (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.bar
pacote:python -c "import foo.bar as _; print(_.__path__[0])"
Como outros observaram, distutils.sysconfig
possui as configurações relevantes:
import distutils.sysconfig
print distutils.sysconfig.get_python_lib()
... embora o padrão site.py
faç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-python
e adiciona os dois caminhos sys.exec_prefix
também, caso essa constante seja diferente).
Dito isto, qual é o contexto? Você não deveria estar mexendo com o seu site-packages
diretamente; 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.
python2
osx e ubuntu com e sem virtualenv, mas não com python3
nada.
python3
.
Uma maneira moderna de stdlib está usando o sysconfig
módulo, disponível nas versões 2.7 e 3.2+.
Nota : sysconfig
( fonte ) não deve ser confundida com o distutils.sysconfig
submódulo ( fonte ) mencionado em várias outras respostas aqui. O último é um módulo totalmente diferente e não possui a get_paths
funçã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 sysconfig
como 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 pip
pode 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_install
e 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_lib
funçã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=True
para 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-packages
parte. De fato, encontrei sistemas onde site-packages
estava /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-packages
ou /lib/python3.6/site-packages
.
pip show <package name>