Как мне найти местоположение моего каталога сайтов-пакетов Python? - PullRequest
791 голосов
/ 23 сентября 2008

Как мне найти расположение моего каталога site-packages?

Ответы [ 20 ]

633 голосов
/ 18 октября 2012
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

(или просто первый элемент с site.getsitepackages()[0])

305 голосов
/ 23 сентября 2008

Из Документация "Как установить Django" (хотя это полезно не только для установки Django) - выполните из оболочки следующее:

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

Отформатирован для удобства чтения (вместо использования в качестве однострочного), который выглядит следующим образом:

from distutils.sysconfig import get_python_lib
print(get_python_lib())
304 голосов
/ 06 сентября 2017

Существует два типа каталогов пакетов сайтов: global и на пользователя .

  1. Глобальные каталоги site-packages (" dist-packages ") перечислены в sys.path при запуске:

    python -m site
    

    Для получения более краткого списка запустите getsitepackages из модуля сайта в коде Python:

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

    Примечание: При использовании virtualenvs getsitepackages недоступно , sys.path, приведенное выше, правильно отобразит каталог site-packages для virtualenv.

  2. Каталог для пользователя *1033* site-packages ( PEP 370 ) - это место, где Python устанавливает ваши локальные пакеты:

    python -m site --user-site
    

    Если это указывает на несуществующий каталог, проверьте состояние выхода Python и см. python -m site --help для объяснений.

    Подсказка: Запуск pip list --user или pip freeze --user предоставляет список всех установленных для пользователя site-пакетов.


Практические советы

  • <package>.__path__ позволяет определить местоположение (я) определенного пакета: ( подробности )

    $ python -c "import setuptools as _; print(_.__path__)"
    ['/usr/lib/python2.7/dist-packages/setuptools']
    
  • <module>.__file__ позволяет определить местоположение определенного модуля: ( разница )

    $ python3 -c "import os as _; print(_.__file__)"
    /usr/lib/python3.6/os.py
    
  • Запустите pip show <package>, чтобы показать информацию о пакете в стиле 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
    
98 голосов
/ 06 января 2011

Для Ubuntu ,

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

... не правильно.

Он укажет на /usr/lib/pythonX.X/dist-packages

Эта папка содержит только пакеты, которые ваша операционная система автоматически установила для запуска программ.

В Ubuntu папка site-packages, содержащая пакеты, установленные через setup_tools \ easy_install \ pip, будет находиться в /usr/local/lib/pythonX.X/dist-packages

Вторая папка, вероятно, более полезна, если пример использования связан с установкой или чтением исходного кода.

Если вы не используете Ubuntu, вы, вероятно, можете безопасно скопировать первый кодовый блок в терминал.

65 голосов
/ 22 мая 2012

Вот что у меня сработало:

python -m site --user-site
23 голосов
/ 23 февраля 2011

Допустим, вы установили пакет 'django'. импортируйте его и введите dir (django). Он покажет вам все функции и атрибуты этого модуля. Введите интерпретатор Python -

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

Вы можете сделать то же самое, если вы установили Mercurial.

Это для снежного барса. Но я думаю, что это должно работать в целом.

21 голосов
/ 23 сентября 2008

Как уже отмечали другие, distutils.sysconfig имеет соответствующие настройки:

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

... хотя значение по умолчанию site.py делает что-то более грубое, перефразируя ниже:

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

(также добавляется ${sys.prefix}/lib/site-python и добавляются оба пути для sys.exec_prefix, если эта константа будет другой).

Тем не менее, каков контекст? Вы не должны связываться с вашим site-packages напрямую; setuptools / distutils будет работать для установки, и ваша программа может быть запущена в virtualenv, где ваш pythonpath полностью локальный для пользователя, поэтому она не должна предполагать непосредственное использование системных пакетов сайта.

16 голосов
/ 08 августа 2013

Собственные системные пакеты, установленные с установкой python в системах на основе Debian, можно найти по адресу:

/ USR / Lib / python2.7 / расстояние-пакеты /

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

используя этот маленький код:

from distutils.sysconfig import get_python_lib
print get_python_lib()

Однако список пакетов, установленных через pip, можно найти по адресу:

/ USR / местные / бен /

Или можно просто написать следующую команду, чтобы перечислить все пути, в которых находятся пакеты Python.

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

Примечание: расположение может отличаться в зависимости от вашей ОС, как в 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']
13 голосов
/ 06 февраля 2012

Все ответы (или: один и тот же ответ повторяется снова и снова) неадекватны. Что вы хотите сделать, это:

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

Последняя строка показывает вам установочный каталог. Работает на Ubuntu, а вышеперечисленные - нет. Не спрашивайте меня о Windows или других дисках, но так как это тот же самый каталог, который easy_install использует по умолчанию, он, вероятно, корректен везде, где работает easy_install (поэтому везде, даже в macs) Повеселись. Примечание: в оригинальном коде много ругательств.

11 голосов
/ 11 ноября 2009

Примечание: предлагаемое решение (distutils.sysconfig.get_python_lib()) не работает, если существует более одного каталога пакетов сайта (как рекомендуется в этой статье ). Он вернет только основной каталог site-packages.

Увы, у меня тоже нет лучшего решения. Похоже, Python не отслеживает каталоги пакетов сайтов, а только пакеты внутри них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...