Как найти расположение каталога моих сайтов?
Как найти расположение моего каталога сайтов сайтов Python?
Ответ 1
Существует два типа каталогов пакетов сайтов, глобальные и для каждого пользователя.
Глобальные каталоги site-packages ("dist-packages") отображаются в
sys.path
при запуске:python -m site
Для более краткого списка запустите
getsitepackages
из модуля сайта в коде Python:python -c "import site; print(site.getsitepackages())"
Примечание. С помощью virtualenvs getsitepackages недоступен, однако
sys.path
из приведенного выше списка будет правильно отображать каталог virtualenv site-packages.Каталог per user сайтов-пакетов для каждого пользователя (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
Ответ 2
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
(или только первый элемент с site.getsitepackages()[0]
)
Ответ 3
Из "Как установить 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())
Ответ 4
Для 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, вы, вероятно, будете безопасно копировать первый код в терминал.
Ответ 5
Это то, что сработало для меня:
python -m site --user-site
Ответ 6
Скажем, вы установили пакет '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. Но я думаю, что он должен работать и в целом.
Ответ 7
Как отмечали другие, 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 полностью локально локален, поэтому он не должен также использовать непосредственно системные сайты-пакеты.
Ответ 8
Собственные системные пакеты, установленные с установкой 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']
Ответ 9
Все ответы (или: один и тот же ответ повторяется снова и снова) неадекватны. Что вы хотите сделать, так это:
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 (так, везде, даже маки). Повеселись. Примечание: исходный код содержит много ругательств.
Ответ 10
Замечание: предлагаемое решение (distutils.sysconfig.get_python_lib()
) не работает, когда существует более одного каталога сайтов-пакетов (как рекомендовано в этой статье). Он вернет только основной каталог сайтов-пакетов.
Увы, у меня нет лучшего решения. Python, похоже, не отслеживает каталоги сайтов-пакетов, а только пакеты внутри них.
Ответ 11
Это работает для меня. Он доставит вам как пакеты dist-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']
Ответ 12
Дополнительная заметка к функции get_python_lib
, упомянутая уже: на некоторых платформах разные каталоги используются для модулей, специфичных для платформы (например: модули, требующие компиляции). Если вы передадите plat_specific=True
в функцию, вы получаете пакеты сайтов для пакетов, специфичных для платформы.
Ответ 13
Это должно работать на всех дистрибутивах в виртуальной среде и из нее из-за этого "низкотехнологичного" характера. Модуль os всегда находится в родительском каталоге "site-packages"
import os; print(os.path.dirname(os.__file__) + '/site-packages')
Чтобы изменить dir на каталог site-packages, я использую следующий псевдоним (в системах * nix):
alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
Ответ 14
Современный способ 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
Ответ 15
from distutils.sysconfig import get_python_lib
print get_python_lib()
Ответ 16
Пип-шоу предоставит все подробности о пакете: https://pip.pypa.io/en/stable/reference/pip_show/ [пип-шоу] [1]
Чтобы получить местоположение:
pip show <package_name>| grep Location
Ответ 17
Ответ на старый вопрос. Но для этого используйте 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
Ответ 18
Вы должны попробовать эту команду, чтобы определить место установки pip
Python 2
pip show six | grep "Location:" | cut -d " " -f2
Python 3
pip3 show six | grep "Location:" | cut -d " " -f2
Ответ 19
Мне нужно было сделать что-то немного другое для проекта, над которым я работал: найти относительный каталог сайтов-пакетов относительно базового установочного префикса. Если папка site-packages находилась в /usr/lib/python2.7/site-packages
, мне нужна часть /lib/python2.7/site-packages
. На самом деле я столкнулся с системами, в которых site-packages
находился в /usr/lib64
, и принятый ответ НЕ работал над этими системами.
Как и ответ cheater, мое решение глубоко заглядывает в кишки 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
.
Ответ 20
Если он уже добавлен в PYTHONPATH
вы также можете сделать что-то вроде
import sys
print('\n'.join(sys.path))