Как мне найти местоположение моего каталога сайтов-пакетов Python?
-
02-07-2019 - |
Вопрос
Как мне найти местоположение каталога пакетов моего сайта?
Решение
Существует два типа каталогов сайтов-пакетов: Глобальный и на пользователя.
Глобальный сайт-пакеты ("дист-пакеты") каталоги перечислены в
sys.path
когда вы запускаете:python -m site
Для более краткого списка выполните
getsitepackages
из модуль сайта в коде Python:python -c "import site; print(site.getsitepackages())"
Примечание: С виртуальными средами getsitepackages недоступен,
sys.path
Тем не менее, сверху будет правильно указан каталог сайтов-пакетов virtualenv.А на пользователя каталог сайтов-пакетов (ПЭП 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
Другие советы
>>> 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())
Для Убунту,
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
Допустим, вы установили пакет «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 будет работать для установки, и ваша программа может работать в виртуальной среде, где ваш путь к python полностью локальный для пользователя, поэтому он также не должен предполагать непосредственное использование системных пакетов сайта.
Собственные системные пакеты, установленные при установке 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/локальный/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']
Все ответы (или:один и тот же ответ, повторяемый снова и снова), неадекватны.То, что вы хотите сделать, это:
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 (то есть везде, даже на Mac).Веселиться.Примечание:в исходном коде много матерных слов.
Примечание:Предлагаемое решение (distutils.sysconfig.get_python_lib()
) не работает, если существует более одного каталога site-packages (как рекомендуется в этой статье).Он вернет только основной каталог пакетов сайта.
Увы, лучшего решения у меня тоже нет.Python, похоже, не отслеживает каталоги сайтов-пакетов, а только пакеты внутри них.
Это работает для меня.Он предоставит вам папки 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']
Дополнительное примечание к get_python_lib
уже упомянутая функция:на некоторых платформах для модулей, специфичных для конкретной платформы, используются разные каталоги (например:модули, требующие компиляции).Если ты пройдешь plat_specific=True
с помощью этой функции вы получаете пакеты сайта для пакетов, специфичных для платформы.
Это должно работать на всех дистрибутивах в виртуальной среде и за ее пределами из-за ее «низкотехнологичной» природы.Модуль os всегда находится в родительском каталоге site-packages.
import os; print(os.path.dirname(os.__file__) + '/site-packages')
Чтобы изменить каталог на каталог site-packages, я использую следующий псевдоним (в системах *nix):
alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
from distutils.sysconfig import get_python_lib
print get_python_lib()
Современный способ stdlib использует sysconfig
модуль, доступный в версиях 2.7 и 3.2+.Python в настоящее время использует восемь пути (документы):
- стандартная библиотека:каталог, содержащий стандартные файлы библиотеки Python, не зависящие от платформы.
- platstdlib:каталог, содержащий стандартные файлы библиотеки Python, зависящие от платформы.
- платформа:каталог для файлов, специфичных для сайта и платформы.
- чистая библиотека:каталог для файлов, специфичных для сайта и не зависящих от платформы.
- включать:каталог для заголовочных файлов, не зависящих от платформы.
- Платинвключение:каталог для файлов заголовков, специфичных для платформы.
- сценарии:каталог для файлов сценариев.
- данные:каталог для файлов данных.
В большинстве случаев пользователи, обнаружившие этот вопрос, будут заинтересованы в пути «purelib» (в некоторые случаи, вас также может заинтересовать «platlib»).В отличие от принятого в настоящее время ответа, этот метод не должен работать неправильно в зависимости от того, активирована ли у вас виртуальная среда.
На системном уровне (это 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
(источник) не следует путать с distutils.sysconfig
субмодуль (источник), упомянутый в нескольких других ответах здесь.Это совершенно другой модуль и в нем нет get_paths
функция, рассмотренная выше.
pip show предоставит всю информацию о пакете:https://pip.pypa.io/en/stable/reference/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-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
.
Вам следует попробовать эту команду, чтобы определить место установки pip.
Питон 2
pip show six | grep "Location:" | cut -d " " -f2
Питон 3
pip3 show six | grep "Location:" | cut -d " " -f2
Если он уже добавлен в PYTHONPATH
вы также можете сделать что-то вроде
import sys
print('\n'.join(sys.path))