Як знайти місце розташування мого каталогу сайтів-пакетів Python?


940

Як знайти місце розташування мого каталогу пакунків для сайтів?


63
Якщо ви просто хочете точне розташування одного пакету, тоді ви можете використовуватиpip show <package name>
joshuakcockrell

Відповіді:


529

Існує два типи каталогів пакетних сайтів, глобальні та на кожного користувача .

  1. Каталоги глобальних веб-сайтів (" dist-пакети ") перераховані sys.pathпід час запуску:

    python -m site

    Більш короткий список запустіть getsitepackagesз модуля сайту в коді Python:

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

    Примітка. Однак, якщо virtualenvs getitepackeges не доступний , sys.pathзгодом буде правильно перелічено каталог сайтів пакунків virtualenv. У Python 3 ви можете використовувати модуль sysconfig замість цього:

    python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'
  2. У каталозі пакунків на кожен користувач ( 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

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])"
Brent Faust

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])


17
Це добре, але, на жаль, ця функція доступна лише з python2.7. Отже, приємне рішення, якщо ви використовуєте python2.7 або вище, але не працюєте на python 2.6 і нижче
Dan Niero

15
python -c "сайт імпорту; print (site.getsitepackages ())"
Lars Schneider

29
Я отримую AttributeError: об’єкт 'module' не має атрибута 'getitepackages' при використанні з virtualenv (python 2.7.8), хоча рішення distutils нижче працює.
radtek

8
@radtek: для venv's я виявляю venv через 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/isissue/355
Гільям Кукурлул

319

Рішення, яке:

  • за межами virtualenv - забезпечує шлях до глобальних пакетів сайтів,
  • insidue a 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, безпосередньо змінитись у каталог-пакунки середовища.
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 папка веб-сайтів, що містить пакунки, встановлені через 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 pipUbuntu, якщо ви не вирішили зробити свій власний дистрибутив: якщо ви використовуєте sudo pip, це ваша відповідальність, щоб переконатися, що всі залежності поточних і майбутніх модулів пітона встановлені через sudo aptабо sudo pipсумісні. Поміркуйте, яку проблему virtualenvбуло створено для вирішення
jfs

Чітке пояснення, щоб зрозуміти відмінності dist-packagesUbuntu 2 в (L).
Тимо

69

Це для мене працювало:

python -m site --user-site

15
Для мене це вказує на папку, яка навіть не існує ( ~/.local/lib/python2.7/site-packages).
Ніл Трафт

1
тим же, в OS X Mavericks, мій будинок .local - це не те, що я хотів, щоб він знайшов, так, так, це все одно не так.
radtek

Її в моїй головній папці / бібліотеці мені довелося вручну переходити до неї, чомусь прямий повний шлях не працював
efwjames

як я можу використовувати встановлені тут пакунки? якщо я virtualenvце роблю, то скаржиться, що пакет не існує. як я можу викликати пакунки, встановлені у власному місці?
AbtPst

2
Це говорить про те, де Python буде шукати специфічні для користувача пакети. Коментарі на кшталт "навіть не існує" і "не те, що я хотів це знайти", не мають сенсу в цьому контексті.
Чесний Ейб

28

Скажімо, ви встановили пакет "django". імпортуйте його та введіть у dir (django). Він покаже вам всі функції та атрибути з цим модулем. Введіть інтерпретатор пітона -

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

Ви можете зробити те ж саме, якщо встановили mercurial.

Це для Snow Leopard. Але я думаю, що це має працювати і в цілому.


>>> імпортувати pg >>> надрукувати pg .__ path__ відстеження (останній дзвінок останній): файл "<stdin>", рядок 1, у <module> AttributeError: "модуль" об'єкта не має атрибута " шлях "
Dannid

вона працює, мені потрібно знайти пакет sklearn, щоб додати до шляху PYDEV, дякую.
Беркай

використовувати django.__file__для цього, а не __path__. і, ні, це не гарантія, що це має щось спільне з пакетами сайтів, але з такими речами, як django, що ви, швидше за все, встановили піп , це буде робити, коли ви поспішаєте, і це можна використовувати для а також інші цілі (наприклад, читання файлу конфігурації за замовчуванням з файлової системи).
JL

Виходячи з цього та інших відповідей, ви можете зробити це в одному рядку з командного рядка, щоб отримати шлях до вашого 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
працює надійно з python2ОСX та 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 : каталог для файлів, що не належать до платформи, специфічних для сайту.
  • включати : каталог для файлів заголовків, не залежних від платформи.
  • platinclude : каталог для файлів заголовків, орієнтованих на платформу.
  • скрипти : каталог для файлів сценаріїв.
  • 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'

З вентиляцією ви отримаєте щось подібне

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

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

python -m sysconfig

Це чудова відповідь, я радий, що новий модуль sysconfig полегшує це. Чи є спосіб отримати локальний префікс platlib, наприклад, наприклад /usr/local/lib/python3.6/site-packages? Традиційно на місцевому рівні повинні заходити речі /usr/local.
eudoxos

Легко найкраща відповідь на це питання! Дякую. Єдине, що я виявив відсутнє - це впорядкування, в якому ці місця перевіряються, коли виникає заява про імпорт. Також, будь-яке з цих місць попередньо шукали / кешували під час завантаження 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 / local / bin /

Або можна просто написати наступну команду, щоб перелічити всі шляхи, де є пакети 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']

Якщо я добре пам’ятаю, dist-пакети характерні для Debian та похідних.
Самуель

1
@SamuelSantana ви праві. dist-пакети характерні для систем на базі debian. У цьому випадку я викликав site.getsitepackages()із встановлення системи, отже, dist-пакети, інші установки показуватимуть пакунки сайту.
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, тоді як вищезгадані - ні. Не питайте мене про вікна чи інші дисти, але оскільки саме той самий dir, який easy_install використовує за замовчуванням, він, ймовірно, правильний скрізь, де працює easy_install (так, скрізь, навіть маки). Весело. Примітка: в оригінальному коді є багато присяжних слів.


1
Дякую, це дуже корисно, на py3 із дужками для друку отримує мені /usr/local/lib/python3.4/dist-packages Я намагаюся розробити, як отримати /usr/lib/python3.4/dist -пакети, тому доведеться грати далі.
Стюарт Ексон

4
вимагає зовнішньої бібліотеки easy_installі не виходить з ладу, якщо недоступна, яка є неадекватною :)
тремтіння

1
Дійсно, це не ідеально, але це спрацювало на мене і зайняло багато часу, щоб розібратися, тому я поклав його тут, сподіваючись, що хтось інший може побудувати час, який я вже витратив на це.
шахрай

13

Побічна примітка: Пропоноване рішення ( distutils.sysconfig.get_python_lib()) не працює, коли існує більше одного каталогу пакунків для сайтів (як це рекомендує ця стаття ). Він поверне лише головний каталог пакунків для сайтів.

На жаль, і в мене немає кращого рішення. Здається, Python не відслідковує каталоги пакунків сайтів, а лише пакети в них.


1
Я думаю, це причина, get_python_lib()коли під час запуску в рамках virtualenv шоу сайт-пакети Python, які використовуються для створення virtualenv, а не сайти-пакети virtualenv .
Пьотр Доброгост

3
@Piotr Це, ймовірно, помилка в distutils.sysconfig. Я тільки що перевірив це, я отримую внутрішні пакети сайтів, як очікувалося.
Тобу

Також протестовано з встановленим Python 2.7 у virtualenv на Linux, і метод distutils.sysconfig працює чудово, щоб отримати внутрішні пакунки сайту Python.
RichVel

12

Це працює для мене. Ви отримаєте як dist-пакети, так і папки-пакунки для сайтів. Якщо папка не стоїть на шляху 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']

2
прийнята відповідь є рекомендованим способом, тож вам слід сказати, чому ваше краще, оскільки це трохи хак
CharlesB

Що не так з хаком? ;) Це простіше і легко зрозуміти і запам'ятати, якщо ви працюєте в інтерактивному режимі.
just_an_old_guy

11

Це повинно працювати над усіма дистрибутивами у віртуальному середовищі та поза ним через його "низькотехнологічний" характер. Модуль os завжди знаходиться в батьківській директорії 'site-пакети'

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

Щоб змінити dir на сайт-пакети dir, я використовую наступний псевдонім (у * nix системах):

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

10

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




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
Це не каталог пакунків для сайтів, а каталог, в який встановлено пакет. Це також корисно лише якщо ви використовуєте iPython і не можете програматично отримати каталог встановлення.
danielunderwood

3

Спробуйте скористатися цією командою для визначення місця установки pip

Пітон 2

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

Пітон 3

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

1

Мені довелося зробити дещо інше для проекту, над яким я працював: знайти відносний каталог сайтів-пакунків щодо префікса базової установки. Якщо в папці site-пакети була /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.


-2

Якщо він уже доданий до PYTHONPATHвас, ви також можете зробити щось на кшталт

import sys
print('\n'.join(sys.path))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.