Как найти местоположение моего каталога сайтов-пакетов Python?
Как найти расположение каталога моего сайта-пакетов?
17 ответов
существует два типа каталогов сайтов-пакетов,глобальные и для каждого пользователя.
-
глобальные site-packages (" dist-пакеты") каталоги перечислены в
sys.path
при запуске:python -m site
для более краткого списка выполнить
getsitepackages
С модуль сайта в коде Python:python -c "import site; print(site.getsitepackages())"
Примечание: С virtualenvs getsitepackages является не доступен,
sys.path
сверху будет правильно указан каталог сайтов-пакетов virtualenv. -
на для каждого пользователя каталог сайтов-пакетов (PEP 370) где Python устанавливает ваши локальные пакеты:
python -m site --user-site
если это указывает на несуществующий каталог, проверьте состояние выхода Python и см.
python -m site --help
для объяснения.подсказка: под управлением
pip list --user
илиpip freeze --user
дает вам список всех установленных для каждого пользователя site-пакеты.
>>> 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())
Для Ubuntu,
python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
...не правильно.
Он будет указывать вам!--1-->
эта папка содержит только пакеты, автоматически установленные операционной системой для запуска программ.
на ubuntu, папка site-packages, содержащая пакеты, установленные через setup_tools\easy_install\pip, будет находиться в /usr/local/lib/pythonX.X/dist-packages
вторая папка, вероятно, более полезна, если вариант использования связано с установкой или чтением исходного кода.
Если вы не используете Ubuntu, вы, вероятно, безопасно копируете первое поле кода в терминал.
как уже отмечалось, 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 полностью является локальным пользователем, поэтому он не должен предполагать использование системных пакетов сайта напрямую.
предположим, вы установили пакет "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.
Это для снежного барса. Но я думаю, что это должно работать в целом.
собственные системные пакеты, установленные с установкой 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']
все ответы (или: один и тот же ответ повторяется снова и снова) являются неадекватными. Что вы хотите сделать это:
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 или других дисках, но поскольку это тот же самый dir, который easy_install использует по умолчанию, это, вероятно, правильно везде, где работает easy_install (так, везде, даже macs). Повеселись. Примечание: исходный код имеет много ругательств в он.
боковое Примечание: предлагаемое решение (distutils.sysconfig.get_python_lib()
) не работает, когда существует более одного каталога site-packages (as рекомендовано в статье). Он вернет только каталог main 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
к функции вы получаете пакеты сайта для конкретных пакетов платформы.
Это должно работать на всех дистрибутивах В и из виртуальной среды из-за его" низкотехнологичной " природы. Модуль ОС всегда находится в Родительском каталоге "site-packages"
import os; print(os.path.dirname(os.__file__) + '/site-packages')
чтобы изменить dir на site-packages dir я использую следующий псевдоним (в системах *nix):
alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
ответ на старый вопрос. Но для этого используйте 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
современный способ stdlib использует sysconfig
модуль, доступный в версии 2.7 и 3.2+. Python в настоящее время использует восемь дорожки (docs):
- stdlib: каталог, содержащий стандартные файлы библиотеки Python, не относящиеся к конкретной платформе.
- platstdlib: каталог, содержащий стандартные файлы библиотеки Python, специфичные для платформы.
- platlib: каталог для специфичных для сайта, специфичных для платформы файлов.
- purelib: каталог для специфичных для сайта, не связанных с платформой файлов.
- включить: каталог для файлов заголовков, не относящихся к платформе.
- platinclude: каталог для файлов заголовков, специфичных для платформы.
- скрипты каталог файлов скрипт.
- сведения каталог файлов данных.
в большинстве случаев пользователи, находящие этот вопрос, будут заинтересованы в пути " 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'
С a венв, ты получишь что-то вроде этого!--15-->
>>> import sysconfig
>>> sysconfig.get_paths()['purelib']
'/private/tmp/.venv/lib/python3.7/site-packages'
сценарий оболочки также доступен для отображения этих сведений, которые можно вызвать, выполнив sysconfig
как модуль:
python -m sysconfig
Примечание: sysconfig
(источник) не следует путать с distutils.sysconfig
подмодуля (источник) упоминается в нескольких других ответах здесь. Это совершенно другой модуль, и ему не хватает
Я должен был сделать что-то немного другое для проекта, над которым я работал: найти относительные каталог 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
.