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

943

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

Дэрил Спитцер
источник
63
Если вы просто хотите узнать точное местоположение одного пакета, вы можете использоватьpip show <package name>
joshuakcockrell

Ответы:

534

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

  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. В Python 3 вы можете использовать вместо этого модуль sysconfig :

    python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'
  2. В каталоге site-packages для каждого пользователя ( PEP 370 ) Python устанавливает ваши локальные пакеты:

    python -m site --user-site

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

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


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

  • <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
Peterino
источник
17
в virtualenv есть каталог пакетов сайта. Вы можете получить каталог для специфичных для сайта модулей внутри / снаружи virtualenv, используя python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"(он работает как на Python 2, так и на 3).
JFS
4
Ницца. И получить первый:python -c "import site; print(site.getsitepackages()[0])"
Брент Фауст
2
Это должно быть в любом базовом руководстве по использованию Python. Я годами питонировал и не знал о модуле сайта. Спас бы столько головных болей ...
salotz
1
Я предложил изменить официальный учебник Python. Пожалуйста, смотрите PR # 16974 для деталей, и спасибо за предложение @salotz!
Петерино,
1
Я думаю, что stackoverflow.com/a/52638888/1365918 легко лучший ответ на этот вопрос.
Капад
652
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

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

eudoxos
источник
17
Это хорошо, но, к сожалению, эта функция доступна только с python2.7. Итак, хорошее решение, если вы используете python2.7 или выше, но не работаете для python 2.6 и ниже
Dan Niero
15
python -c "импорт сайта; печать (site.getsitepackages ())"
Ларс Шнайдер
29
Я получаю AttributeError: у объекта 'module' нет атрибута 'getsitepackages' при использовании с virtualenv (python 2.7.8), хотя ниже работает решение distutils.
Радтек
8
@radtek: для venv я определяю venv via, hasattr(sys,'real_prefix')а затем эвристически определяю пакеты сайтов [p for p in sys.path if p.endswith('site-packages')][-1](плюс проверяю, найден ли один из них, прежде чем делать [-1].
eudoxos
4
@radtek Это известная ошибка, что модуль сайта не работает для virtualenv github.com/pypa/virtualenv/issues/355
Гиллем Кукурулль,
319

Решение, которое:

  • за пределами virtualenv - обеспечивает путь к глобальным сайт-пакетам,
  • Insidue Virtualenv - предоставляет сайт-пакеты virtualenv

... это одна строка:

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

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

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


Источник: очень старая версия документации «Как установить Django» (хотя это полезно не только для установки Django)

Дэрил Спитцер
источник
1
Предоставляет ли virtualenv способ найти свои пакеты сайтов?
Дэрил Спитцер
10
Вы можете использовать virtualenvwrapper, у которого есть команда cdsitepackages, чтобы напрямую перейти в каталог site-packages среды.
john2x
6
@PiotrDobrogost: у меня работает на Python 2.7 в virtualenv на Linux
RichVel
2
Первый комментарий больше не применяется: он показал правильное местоположение как снаружи, так и внутри virtualenv.
astrojuanlu
2
У меня не работает на Windows 10 с использованием Linux Bash, он возвращает /usr/lib/python3/dist-packagesвместо /usr/lib/python3.5/dist-packages.
Дельган
99

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

Дэвид Холландер
источник
3
Если спрашивающий находится за определенным местоположением пакета, module.__file__это лучший способ. Если они пытаются установить вещи ... просто используйте инструменты.
Тобу
'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages()на Ubuntu (хотя это идет после /usr/local/... в списке). Вы получаете что-то только /usr/localчерез via, sudo pipи вы не должны использовать sudo pipв Ubuntu, если вы не решили сделать свой собственный дистрибутив: если вы используете sudo pip, то вы должны убедиться, что все зависимости текущих и будущих модулей python установлены через sudo aptили sudo pipсовместимы. Подумайте, какую проблему virtualenvсоздали, чтобы решить
jfs
Четкое объяснение, чтобы понять различия 2 dist-packagesв (L) Ubuntu.
Тимо
69

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

python -m site --user-site
Ramashri
источник
15
Для меня это указывает на папку, которая даже не существует ( ~/.local/lib/python2.7/site-packages).
Нил Трафт
1
то же самое, в OS X Mavericks, мой домашний .local - это не то, что я хотел, чтобы найти, плюс, да, его там нет.
Радтек
Он находился в моей главной папке / библиотеке, и мне пришлось вручную перейти к нему, по какой-то причине прямой полный путь не работал
efwjames,
Как я могу использовать пакеты, установленные здесь? если я делаю virtualenvэто, он жалуется, что пакет не существует. Как вызвать пакеты, установленные в произвольном месте?
AbtPst
2
Это говорит вам, где Python будет искать пользовательские пакеты. Такие комментарии, как «даже не существует» и «не то, что я хотел найти», не имеют смысла в этом контексте.
Честный Абэ
28

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

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

Sumod
источник
>>> import pg >>> print pg .__ path__ Traceback (последний вызов был последним): файл "<stdin>", строка 1, в <module> AttributeError: у объекта 'module' нет атрибута ' path '
Даннид
это работает, мне нужно найти пакет sklearn для добавления в путь PYDEV, спасибо.
Беркей
использовать django.__file__для этого, а не __path__. и, нет, это не гарантия, что это имеет какое-либо отношение к пакетам сайта, но с такими вещами, как django, которые вы, скорее всего, установили в pip , это будет делать, когда вы спешите, и его можно использовать для а также для других целей (например, чтение файла конфигурации по умолчанию из файловой системы).
JL Peyret
Основываясь на этом и других ответах, вы можете сделать это в одной строке из командной строки, чтобы получить путь к вашему foo.barпакету:python -c "import foo.bar as _; print(_.__path__[0])"
snark
23

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

Чарльз Даффи
источник
3
работает надежно с python2OSX и Ubuntu с и без virtualenv, но не с python3вообще.
джиттер
2
2008 год был давно - этот ответ был за три месяца до выхода Python 3.0.
Чарльз Даффи
конечно, но сегодня мой комментарий может помочь. поправь меня если я не прав. кроме того, я не понизил этот ответ или любой другой в отношении python3.
джиттер
22

Современный способ stdlib использует sysconfigмодуль, доступный в версиях 2.7 и 3.2+.

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

В настоящее время 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
Wim
источник
Это отличный ответ, я рад, что новый модуль sysconfig делает это проще. Есть ли способ получить локальный префикс platlib, например /usr/local/lib/python3.6/site-packages? Традиционно, локально установленные вещи должны войти /usr/local.
Евдокос
Легко лучший ответ на этот вопрос! Спасибо. Единственное, что я обнаружил отсутствующим, - это порядок, в котором эти местоположения проверяются при обнаружении оператора импорта. Кроме того, какие-либо из этих местоположений предварительно ищутся / кэшируются при загрузке Python? Знание этого также было бы полезно ИМО.
Капад
21

Нативные системные пакеты, установленные с установкой 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']
fnatic_shank
источник
Если я правильно помню, dist-пакеты специфичны для Debian и производных.
Самуил
1
@SamuelSantana вы правы. dist-пакеты специфичны для систем на основе Debian. В этом случае я вызвал site.getsitepackages()из системы установки отсюда dist-пакеты, другие установки покажут site-пакеты.
fnatic_shank
15

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

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

мошенника
источник
1
Спасибо, это очень полезно, на py3 с скобками для печати он получает меня /usr/local/lib/python3.4/dist-packages Я пытаюсь понять, как получить /usr/lib/python3.4/dist -пакеты так играть дальше придется.
Стюарт Аксон
4
требует внешней библиотеки easy_installи не выходит из строя изящно, если недоступен, что неадекватно :)
jitter
1
действительно, это не идеально, но это сработало для меня и заняло много времени, чтобы выяснить это, поэтому я выразил это здесь в надежде, что кто-то другой сможет использовать то время, которое я уже потратил на это.
Мошенник
13

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

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

Владимир Вагайцев
источник
1
Я полагаю, что это причина, по которой get_python_lib()при запуске из virtualenv показываются пакеты сайтов Python, используемые для создания virtualenv, а не пакеты сайтов virtualenv .
Петр Доброгост
3
@Piotr Это, вероятно, ошибка в distutils.sysconfig. Я только что проверил это, и я получил внутренние пакеты сайта, как и ожидалось.
Тобу
Также протестирован с Python 2.7, установленным в virtualenv в Linux, и метод distutils.sysconfig прекрасно работает для получения внутренних пакетов сайта Python.
RichVel
12

Это работает для меня. Он получит как папки 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']
just_an_old_guy
источник
2
принятый ответ - рекомендуемый способ, поэтому вы должны сказать, почему ваш лучше, так как это немного хакерство
CharlesB
Что не так с хаком? ;) Это проще и легче понять и запомнить, если вы работаете в интерактивном режиме.
just_an_old_guy
11

Это должно работать на всех дистрибутивах в и из виртуальной среды из-за ее «низкотехнологичного» характера. Модуль 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'
Пирамида Новичок
источник
10

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

Армин Ронахер
источник
8
from distutils.sysconfig import get_python_lib
print get_python_lib()
Флориан Бёш
источник
3

Ответ на старый вопрос. Но используйте для этого 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
Сахил Агарвал
источник
1
Это не каталог site-packages, а каталог, в который установлен пакет. Это также полезно только в том случае, если вы используете iPython, а не для того, чтобы иметь возможность программно получить установочный каталог.
Даниэльвудвуд
3

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

Python 2

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

Python 3

pip3 show six | grep "Location:" | cut -d " " -f2
ржавчина
источник
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.

MultipleMonomials
источник
-2

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

import sys
print('\n'.join(sys.path))
filtfilt
источник