Как мне найти местоположение моего каталога сайтов-пакетов Python? - PullRequest
791 голосов
/ 23 сентября 2008

Как мне найти расположение моего каталога site-packages?

Ответы [ 20 ]

10 голосов
/ 30 марта 2012

Это работает для меня. Он получит как папки 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']
8 голосов
/ 15 марта 2015

Это должно работать на всех дистрибутивах в и из виртуальной среды из-за ее «низкотехнологичного» характера. Модуль 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'
8 голосов
/ 23 сентября 2008

Дополнительное примечание к упомянутой функции get_python_lib: на некоторых платформах разные модули используются для платформо-зависимых модулей (например: модули, требующие компиляции) Если вы передадите plat_specific=True функции, вы получите пакеты сайта для пакетов, специфичных для платформы.

7 голосов
/ 23 сентября 2008
from distutils.sysconfig import get_python_lib
print get_python_lib()
5 голосов
/ 03 января 2019

Пип-шоу даст все детали о пакете: https://pip.pypa.io/en/stable/reference/pip_show/ [pip show] [1]

Чтобы получить местоположение:

pip show <package_name>| grep Location
4 голосов
/ 04 октября 2018

Современный способ stdlib использует модуль sysconfig, доступный в версиях 2.7 и 3.2+. В настоящее время 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

Примечание: sysconfig ( источник ) не следует путать с упомянутым подмодулем distutils.sysconfig ( источник ) в нескольких других ответах здесь. Это совершенно другой модуль, и в нем отсутствует функция get_paths, описанная выше.

2 голосов
/ 18 июля 2016

Ответ на старый вопрос. Но используйте для этого 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
0 голосов
/ 06 мая 2019

Вы должны попробовать эту команду, чтобы определить место установки pip

Python 2

pip show six | grep "Location:" | cut -d " " -f2

Python 3

pip3 show six | grep "Location:" | cut -d " " -f2
0 голосов
/ 13 ноября 2018

Если он уже добавлен к PYTHONPATH, вы также можете сделать что-то вроде

import sys
print('\n'.join(sys.path))
0 голосов
/ 16 декабря 2017

Мне пришлось сделать что-то немного другое для проекта, над которым я работал: найти каталог относительный 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...