Как мне найти местоположение моего каталога сайтов-пакетов Python?

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

23 ответа

Решение

Существует два типа каталогов сайтов-пакетов, глобальные и для каждого пользователя.

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

    python -m site
    

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

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

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

  2. В каталоге site-packages для каждого пользователя ( PEP 370) Python устанавливает ваши локальные пакеты:

    python -m site --user-site
    

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

    Подсказка: Бег pip list --user или же pip freeze --user дает вам список всех установленных для каждого пользователя сайтов-пакетов.

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

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

Из документации "Как установить 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())

Для 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, вы, вероятно, можете безопасно вставить первый кодовый блок в терминал.

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

python -m site --user-site

Современный способ stdlib использует sysconfig модуль, доступный в версиях 2.7 и 3.2+. В настоящее время Python использует восемь путей ( документов):

  • stdlib: каталог, содержащий стандартные файлы библиотеки Python, которые не зависят от платформы.
  • platstdlib: каталог, содержащий стандартные файлы библиотеки Python, которые зависят от платформы.
  • platlib: каталог для файлов, специфичных для сайта, для платформы.
  • purelib: каталог для файлов, не относящихся к платформе.
  • include: каталог для не зависящих от платформы заголовочных файлов.
  • platinclude: каталог для заголовочных файлов для конкретной платформы.
  • scripts: каталог для файлов сценариев.
  • data: каталог для файлов данных.

В большинстве случаев пользователи, находящие этот вопрос, будут заинтересованы в пути "purelib" (в некоторых случаях вас также может заинтересовать "platlib"). В отличие от принятого в настоящее время ответа, этот метод не должен работать неправильно в зависимости от того, активирован ли у вас virtualenv.

На системном уровне (это Python 3.7.0 в 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'

С venv вы получите что-то вроде этого

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

Сценарий оболочки также доступен для отображения этих деталей, которые вы можете вызвать, выполнив sysconfig как модуль:

python -m sysconfig

Замечания: sysconfig ( источник) не следует путать с distutils.sysconfig субмодуль ( источник) упоминается в нескольких других ответах здесь. Это совершенно другой модуль, и ему не хватает get_paths функция обсуждаемая выше.

Допустим, вы установили пакет '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.

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

Как отметили другие, 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 полностью локальный для пользователя, поэтому она не должна также предполагать непосредственное использование системных пакетов сайта.

Пип-шоу предоставит все подробности о пакете: https://pip.pypa.io/en/stable/reference/pip_show/ [пип-шоу][1]

Чтобы получить местоположение:

pip show <package_name>| grep Location

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

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

В 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']

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

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). Повеселись. Примечание: в оригинальном коде много ругательств.

Это работает для меня. Он получит как папки dist-packages, так и папки site-packages. Если папка не находится на пути Python, она все равно не принесет вам пользы.

import sys; 
print [f for f in sys.path if f.endswith('packages')]

Вывод (установка Ubuntu):

['/home/username/.local/lib/python2.7/site-packages',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages']

Это должно работать на всех дистрибутивах внутри и вне виртуальной среды из-за ее "низкотехнологичного" характера. Модуль os всегда находится в родительском каталоге 'site-packages'

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

Чтобы изменить dir на dir site-packages, я использую следующий псевдоним (в системах *nix):

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

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

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

Дополнительное примечание к get_python_lib функция уже упоминалась: на некоторых платформах для отдельных платформ используются разные каталоги (например, модули, требующие компиляции). Если вы пройдете plat_specific=True к функции вы получаете пакеты сайта для пакетов, специфичных для платформы.

from distutils.sysconfig import get_python_lib
print get_python_lib()

Вы должны попробовать эту команду, чтобы определить место установки pip

Python 2

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

Python 3

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

Ответ на старый вопрос. Но используйте для этого ipython.

pip install ipython
ipython 
import imaplib
imaplib?

Это даст следующий вывод о пакете 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

Для тех, кто использует поэзию, вы можете найти свой путь виртуальной среды с poetry debug:

$ poetry debug

Poetry
Version: 1.1.4
Python:  3.8.2

Virtualenv
Python:         3.8.2
Implementation: CPython
Path:           /Users/cglacet/.pyenv/versions/3.8.2/envs/my-virtualenv
Valid:          True

System
Platform: darwin
OS:       posix
Python:   /Users/cglacet/.pyenv/versions/3.8.2

Используя эту информацию, вы можете перечислить пакеты сайта:

ls /Users/cglacet/.pyenv/versions/3.8.2/envs/my-virtualenv/lib/python3.8/site-packages/

Я сделал очень простую функцию, которая выполняет свою работу

      import site


def get_site_packages_dir():
        return [p for p  in site.getsitepackages()
                if "site-packages" in p][0]

get_site_packages_dir()
# '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages'

Если вы хотите получить результаты с помощью терминала:

      python3 -c "import site;print([p for p in site.getsitepackages() if 'site-package' in p][0])"

/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages


То, что не упоминалось, что я считаю полезным, если у вас установлены две версии Python, например, как 3.8, так и 3.5, на вашем компьютере могут быть две папки, называемые пакетами сайтов. В этом случае вы можете указать версию Python, используя следующее:

py -3.5 -c "import site; print(site.getsitepackages()[1])

Для проекта, над которым я работал, мне пришлось сделать что-то немного другое: найти относительный каталог site-packages относительно базового префикса установки. Если папка site-packages находилась в /usr/lib/python2.7/site-packagesЯ хотел /lib/python2.7/site-packages часть. На самом деле я столкнулся с системами, в которых site-packages был в /usr/lib64и принятый ответ НЕ работал на этих системах.

Подобно ответу мошенника, мое решение заглядывает глубоко в кишки Distutils, чтобы найти путь, который фактически проходит внутри setup.py, Было так тяжело понять, что я не хочу, чтобы кто-нибудь когда-нибудь снова это выяснил.

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', ''))

Это должно напечатать что-то вроде /Lib/site-packages или же /lib/python3.6/site-packages,

Если он уже добавлен в PYTHONPATH Вы также можете сделать что-то вроде

import sys
print('\n'.join(sys.path))
Другие вопросы по тегам