Как мне узнать, где находится каталог моих сайтов-пакетов?
Как мне найти местоположение моего каталога пакетов сайта Python?
Ответы (20)
Есть два типа каталогов пакетов сайтов: глобальные и для каждого пользователя.
Глобальные пакеты сайтов ("dist -packages ") будут перечислены в
sys.path
при запуске:python -m site
Для получения более краткого списка запустите
getsitepackages
из модуля сайта в Python. код:python -c 'import site; print(site.getsitepackages())'
Примечание. В virtualenvs пакеты GetSite недоступны,
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, так и на Python 3). ).
- person jfs; 13.09.2017
python -c "import site; print(site.getsitepackages()[0])"
- person Brent Faust; 04.05.2018
python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'
сэкономила мне несколько часов на отладку пакета при компиляции tenorflow с помощью bazel.
- person PhatHV; 18.10.2020
>>> 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]
.
- person eudoxos; 15.08.2014
sys.path
.
- person Zhang LongQI; 03.02.2017
pip install --user PACKAGE_NAME
- person Zhang LongQI; 03.02.2017
Решение, которое:
- за пределами 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)
cdsitepackages
, чтобы напрямую перейти в каталог site-packages среды.
- person john2x; 10.02.2012
/usr/lib/python3/dist-packages
вместо /usr/lib/python3.5/dist-packages
.
- person Delgan; 15.09.2017
Для 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, вы, вероятно, безопасно скопируете первое поле кода в терминал.
module.__file__
- лучший способ. Если они пытаются что-то установить… просто используйте инструменты.
- person Tobu; 30.11.2012
'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages()
в Ubuntu (хотя в списке он идет после /usr/local/...
). Вы получаете что-то только в /usr/local
через sudo pip
, и вам не следует использовать sudo pip
в Ubuntu, если вы не решили создать свой собственный дистрибутив: если вы используете sudo pip
, вы обязаны убедиться, что все зависимости текущего и будущего < / i> модули python, установленные через sudo apt
или sudo pip
, совместимы. Подумайте, какая проблема virtualenv
была создана для решения
- person jfs; 13.09.2017
dist-packages
в (L) Ubuntu.
- person Timo; 28.11.2017
Вот что сработало для меня:
python -m site --user-site
~/.local/lib/python2.7/site-packages
).
- person Neil Traft; 11.07.2014
virtualenv
, он жалуется, что пакет не существует. как вызвать пакеты, установленные в произвольном месте?
- person AbtPst; 26.04.2016
python setup.py develop --script-dir ~/bin --install-dir /home/thomp/.local/lib/python2.7/site-packages
- person dat; 30.09.2016
Допустим, вы установили пакет 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.
Это для Snow Leopard. Но я думаю, что это должно работать и в целом.
django.__file__
, а не __path__
. и нет, это не гарантия, что это имеет какое-либо отношение к пакетам сайта, но с такими вещами, как django, которые вы, скорее всего, установили pip, он будет работать, когда вы находитесь в поторопитесь, и его можно использовать и для других целей (например, для чтения файла конфигурации по умолчанию из файловой системы).
- person JL Peyret; 16.03.2019
foo.bar
пакету: python -c "import foo.bar as _; print(_.__path__[0])"
- person snark; 12.12.2019
Современный способ stdlib использует модуль sysconfig
, доступный в версиях 2.7 и 3.2+. В отличие от текущего принятого ответа, этот метод по-прежнему работает независимо от того, активна ли у вас виртуальная среда.
Примечание: sysconfig
(исходный код) не следует путать с подмодулем distutils.sysconfig
(источник ) упоминается в нескольких других ответах здесь. Последний - это совершенно другой модуль, и в нем отсутствует функция get_paths
, обсуждаемая ниже.
В настоящее время Python использует восемь путей (docs):
- stdlib: каталог, содержащий файлы стандартной библиотеки Python, не зависящие от платформы.
- platstdlib: каталог, содержащий файлы стандартной библиотеки Python, зависящие от платформы.
- platlib: каталог для файлов для конкретных платформ и сайтов.
- purelib: каталог для файлов, специфичных для сайта, не зависящих от платформы.
- include: каталог для файлов заголовков, не зависящих от платформы.
- platinclude: каталог для файлов заголовков, зависящих от платформы.
- scripts: каталог для файлов скриптов.
- данные: каталог для файлов данных.
В большинстве случаев пользователям, которые задают этот вопрос, будет интересен путь purelib (в некоторых случаях вас может заинтересовать в платлибе тоже). Путь purelib - это место, где обычные пакеты Python будут установлены такими инструментами, как pip
.
На системном уровне вы увидите что-то вроде этого:
# Linux
$ python3 -c "import sysconfig; print(sysconfig.get_path('purelib'))"
/usr/local/lib/python3.8/site-packages
# macOS (brew installed python3.8)
$ python3 -c "import sysconfig; print(sysconfig.get_path('purelib'))"
/usr/local/Cellar/[email protected]/3.8.3/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages
# Windows
C:\> py -c "import sysconfig; print(sysconfig.get_path('purelib'))"
C:\Users\wim\AppData\Local\Programs\Python\Python38\Lib\site-packages
С венвом вы получите что-то вроде этого
# Linux
/tmp/.venv/lib/python3.8/site-packages
# macOS
/private/tmp/.venv/lib/python3.8/site-packages
# Windows
C:\Users\wim\AppData\Local\Temp\.venv\Lib\site-packages
Функция sysconfig.get_paths()
возвращает dict всех соответствующих путей установки. , пример в Linux:
>>> import sysconfig
>>> sysconfig.get_paths()
{'stdlib': '/usr/local/lib/python3.8',
'platstdlib': '/usr/local/lib/python3.8',
'purelib': '/usr/local/lib/python3.8/site-packages',
'platlib': '/usr/local/lib/python3.8/site-packages',
'include': '/usr/local/include/python3.8',
'platinclude': '/usr/local/include/python3.8',
'scripts': '/usr/local/bin',
'data': '/usr/local'}
Также доступен сценарий оболочки для отображения этих сведений, который можно вызвать, выполнив sysconfig
как модуль:
python -m sysconfig
platlib
, например, /usr/local/lib/python3.6/site-packages
? Традиционно локально установленные вещи должны идти в /usr/local
.
- person eudoxos; 07.12.2019
Как отмечали другие, 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, где ваш путь к python полностью локален для пользователя, поэтому он также не должен предполагать использование системных пакетов сайта напрямую.
python2
на osx и ubuntu с virtualenv и без него, но не с python3
вообще.
- person jitter; 18.05.2016
python3
.
- person jitter; 18.05.2016
Собственные системные пакеты, установленные с установкой 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']
site.getsitepackages()
из установки системы, следовательно, пакеты dist, другие установки будут отображать пакеты сайтов.
- person fnatic_shank; 23.03.2018
Все ответы (или: один и тот же ответ повторяется снова и снова) неадекватны. Что вы хотите сделать:
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, а вышеперечисленные - нет. Не спрашивайте меня об окнах или других дисках, но поскольку это тот же самый каталог, который easy_install использует по умолчанию, он, вероятно, верен везде, где работает easy_install (так, везде, даже для Mac). Повеселись. Примечание: в исходном коде много нецензурных словечек.
easy_install
и не завершается корректно, если недоступна, что неадекватно :)
- person jitter; 18.05.2016
Примечание: предлагаемое решение (distutils.sysconfig.get_python_lib()
) не работает, когда существует более одного каталога пакетов сайтов (как рекомендовано в этой статье). Он вернет только основной каталог сайтов-пакетов.
Увы, лучшего решения у меня тоже нет. Python, похоже, не отслеживает каталоги пакетов сайтов, а только пакеты внутри них.
get_python_lib()
при запуске из virtualenv показывает site-packages Python, используемый для создания virtualenv, а не site-packages virtualenv.
- person Piotr Dobrogost; 12.11.2011
pip show предоставит все сведения о пакете: https://pip.pypa.io/en/stable/reference/pip_show/ [pip show] [1]
Чтобы узнать местоположение:
pip show <package_name>| grep Location
В Linux вы можете перейти в папку site-packages:
cd $(python -c "import site; print(site.getsitepackages()[0])")
pip3 show foo | grep Location | cut -d ' ' -f 2
- person crajun; 04.12.2020
У меня это работает. Он предоставит вам папки как 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')
Чтобы изменить каталог на каталог сайтов-пакетов, я использую следующий псевдоним (в системах * nix):
alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
Дополнительное примечание к уже упомянутой функции get_python_lib
: на некоторых платформах разные каталоги используются для модулей, специфичных для платформы (например, для модулей, требующих компиляции). Если вы передадите plat_specific=True
функции, вы получите пакеты сайта для пакетов, специфичных для платформы.
Вы должны попробовать эту команду, чтобы определить место установки 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/
Для проекта, над которым я работал, мне пришлось сделать что-то немного другое: найти каталог relative 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
.
То, что не было упомянуто, что я считаю полезным, если у вас установлены две версии Python, например. как 3.8, так и 3.5 на вашем компьютере могут быть две папки, называемые пакетами сайтов. В этом случае вы можете указать версию Python, используя следующее:
py -3.5 -c "import site; print(site.getsitepackages()[1])
pip show <package name>
- person joshuakcockrell   schedule 25.07.2017