Відповіді:
Існує два типи каталогів пакетних сайтів, глобальні та на кожного користувача .
Каталоги глобальних веб-сайтів (" 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"])'
У каталозі пакунків на кожен користувач ( 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
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
(він працює і на Python 2, і 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']
(або лише перший елемент із site.getsitepackages()[0]
)
hasattr(sys,'real_prefix')
і потім евристично визначаю пакети сайтів [p for p in sys.path if p.endswith('site-packages')][-1]
(плюс перевірити, чи є такий, знайдений перед тим, як зробити [-1]
.
Рішення, яке:
... це один вкладиш:
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)
cdsitepackages
, безпосередньо змінитись у каталог-пакунки середовища.
/usr/lib/python3/dist-packages
замість /usr/lib/python3.5/dist-packages
.
Для 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, ви, ймовірно, безпечно копіюєте вставлення першого кодового поля в термінал.
module.__file__
це кращий спосіб. Якщо вони намагаються встановити речі ... просто використовуйте інструменти.
'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages()
на Ubuntu (хоча вона йде після /usr/local/...
того, як в списку). Ви отримуєте лише щось /usr/local
через via, sudo pip
і ви не повинні використовувати sudo pip
Ubuntu, якщо ви не вирішили зробити свій власний дистрибутив: якщо ви використовуєте sudo pip
, це ваша відповідальність, щоб переконатися, що всі залежності поточних і майбутніх модулів пітона встановлені через sudo apt
або sudo pip
сумісні. Поміркуйте, яку проблему virtualenv
було створено для вирішення
dist-packages
Ubuntu 2 в (L).
Це для мене працювало:
python -m site --user-site
~/.local/lib/python2.7/site-packages
).
virtualenv
це роблю, то скаржиться, що пакет не існує. як я можу викликати пакунки, встановлені у власному місці?
Скажімо, ви встановили пакет "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. Але я думаю, що це має працювати і в цілому.
django.__file__
для цього, а не __path__
. і, ні, це не гарантія, що це має щось спільне з пакетами сайтів, але з такими речами, як django, що ви, швидше за все, встановили піп , це буде робити, коли ви поспішаєте, і це можна використовувати для а також інші цілі (наприклад, читання файлу конфігурації за замовчуванням з файлової системи).
foo.bar
пакету:python -c "import foo.bar as _; print(_.__path__[0])"
Як зазначали інші, 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 є повністю локальним для користувачів, тому він також не повинен припускати використання системних пакетів сайтів безпосередньо.
python2
ОСX та Ubuntu з і без virtualenv, але зовсім не з python3
.
python3
.
Сучасний спосіб 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
platlib
, наприклад, наприклад /usr/local/lib/python3.6/site-packages
? Традиційно на місцевому рівні повинні заходити речі /usr/local
.
Народні системні пакети, встановлені з встановленням 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']
site.getsitepackages()
із встановлення системи, отже, dist-пакети, інші установки показуватимуть пакунки сайту.
Усі відповіді (або: та сама відповідь, повторювана знову і знову) є неадекватними. Що ви хочете зробити, це:
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 (так, скрізь, навіть маки). Весело. Примітка: в оригінальному коді є багато присяжних слів.
easy_install
і не виходить з ладу, якщо недоступна, яка є неадекватною :)
Побічна примітка: Пропоноване рішення ( distutils.sysconfig.get_python_lib()
) не працює, коли існує більше одного каталогу пакунків для сайтів (як це рекомендує ця стаття ). Він поверне лише головний каталог пакунків для сайтів.
На жаль, і в мене немає кращого рішення. Здається, Python не відслідковує каталоги пакунків сайтів, а лише пакети в них.
get_python_lib()
коли під час запуску в рамках virtualenv шоу сайт-пакети Python, які використовуються для створення virtualenv, а не сайти-пакети virtualenv .
Це працює для мене. Ви отримаєте як 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']
Це повинно працювати над усіма дистрибутивами у віртуальному середовищі та поза ним через його "низькотехнологічний" характер. Модуль 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'
Додаткова примітка до get_python_lib
вже згаданої функції: на деяких платформах використовуються різні каталоги для конкретних модулів платформи (наприклад: модулі, які потребують компіляції). Якщо ви перейдете plat_specific=True
до функції, ви отримаєте сайти для певних платформних пакетів.
from distutils.sysconfig import get_python_lib
print get_python_lib()
pip show надасть усі подробиці щодо пакета: https://pip.pypa.io/en/stable/reference/pip_show/ [pip show] [1]
Щоб отримати місцезнаходження:
pip show <package_name>| grep Location
Відповідь на старе запитання. Але використовуйте для цього 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
Мені довелося зробити дещо інше для проекту, над яким я працював: знайти відносний каталог сайтів-пакунків щодо префікса базової установки. Якщо в папці 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
.
Якщо він уже доданий до PYTHONPATH
вас, ви також можете зробити щось на кшталт
import sys
print('\n'.join(sys.path))
pip show <package name>