Odpowiedzi:
Istnieją dwa typy katalogów pakietów witryn, globalne i na użytkownika .
Katalogi globalnych pakietów serwisów („pakiety dystrybucyjne ”) są wyświetlane sys.pathpo uruchomieniu:
python -m site
Dla bardziej zwięzły listy prowadzonej getsitepackagesz modułem miejscu w kodzie Pythona:
python -c 'import site; print(site.getsitepackages())'
Uwaga: Z virtualenvs getitepackages nie jest dostępny , sys.pathz góry jednak poprawnie wyświetli katalog pakietów witryny wirtualnych. W Pythonie 3 możesz zamiast tego użyć modułu sysconfig :
python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'Każdego użytkownika site-pakiety katalog ( PEP 370 ), gdzie Python instaluje lokalne pakiety:
python -m site --user-site
Jeśli to wskazuje na nieistniejący katalog, sprawdź status wyjścia Pythona i zobacz python -m site --helpwyjaśnienia.
Wskazówka: Uruchamianie pip list --userlub pip freeze --userdaje listę wszystkich zainstalowanych pakietów witryn użytkownika .
<package>.__path__pozwala zidentyfikować lokalizację konkretnej paczki: ( szczegóły )
$ python -c "import setuptools as _; print(_.__path__)"
['/usr/lib/python2.7/dist-packages/setuptools']<module>.__file__pozwala zidentyfikować lokalizację konkretnego modułu: ( różnica )
$ python3 -c "import os as _; print(_.__file__)"
/usr/lib/python3.6/os.pyUruchom, pip show <package>aby wyświetlić informacje o pakiecie w stylu Debiana:
$ 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, pluggypython -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"(działa to zarówno na Pythonie 2, jak i 3).
python -c "import site; print(site.getsitepackages()[0])"
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
(lub tylko pierwszy element z site.getsitepackages()[0])
hasattr(sys,'real_prefix')a następnie heurystycznie określam pakiety witryn [p for p in sys.path if p.endswith('site-packages')][-1](plus sprawdzam, czy został znaleziony przed wykonaniem [-1].
Rozwiązanie, które:
... to ten jednowarstwowy:
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
Sformatowany pod kątem czytelności (zamiast używania jako jednowarstwowy), wygląda następująco:
from distutils.sysconfig import get_python_lib
print(get_python_lib())
Źródło: bardzo stara wersja dokumentacji „Jak zainstalować Django” (chociaż jest to przydatne nie tylko do instalacji Django)
cdsitepackages, aby bezpośrednio przejść do katalogu pakietów witryny.
/usr/lib/python3/dist-packageszamiast /usr/lib/python3.5/dist-packages.
Dla Ubuntu ,
python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
...nie jest poprawne.
Wskaże ci to /usr/lib/pythonX.X/dist-packages
Ten folder zawiera tylko pakiety, które system operacyjny automatycznie zainstalował, w celu uruchomienia programów.
W Ubuntu będzie znajdować się folder site-packages zawierający pakiety zainstalowane przez setup_tools \ easy_install \ pip/usr/local/lib/pythonX.X/dist-packages
Drugi folder jest prawdopodobnie najbardziej przydatny, jeśli przypadek użycia dotyczy instalacji lub odczytu kodu źródłowego.
Jeśli nie korzystasz z Ubuntu, prawdopodobnie bezpiecznie wklejasz pierwszą skrzynkę z kodem do terminala.
module.__file__jest to lepszy sposób. Jeśli próbują coś zainstalować… po prostu użyj narzędzi.
'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages()na Ubuntu (choć jest to po /usr/local/... liście). Dostajesz tylko coś /usr/localza pośrednictwem sudo pipi nie powinieneś używać sudo pipna Ubuntu, chyba że zdecydujesz się stworzyć własną dystrybucję: jeśli używasz sudo pip, Twoim obowiązkiem jest upewnić się, że wszystkie zależności między obecnymi i przyszłymi modułami Pythona zainstalowanymi przez sudo aptlub sudo pipsą kompatybilne. Zastanów się, jaki problem virtualenvzostał rozwiązany
dist-packagesUbuntu 2 w (L).
Oto, co zadziałało dla mnie:
python -m site --user-site
~/.local/lib/python2.7/site-packages).
virtualenvto zrobię , narzeka, że pakiet nie istnieje. jak wywołać pakiety zainstalowane w niestandardowej lokalizacji?
Załóżmy, że zainstalowałeś pakiet „django”. zaimportuj go i wpisz dir (django). Pokaże Ci wszystkie funkcje i atrybuty tego modułu. Wpisz interpreter Pythona -
>>> import django
>>> dir(django)
['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'get_version']
>>> print django.__path__
['/Library/Python/2.6/site-packages/django']
Możesz zrobić to samo, jeśli zainstalowałeś mercurial.
To jest dla Snow Leopard. Ale myślę, że powinno to również ogólnie działać.
django.__file__do tego zamiast __path__. i nie, nie jest to gwarancją, że ma to coś wspólnego z pakietami witryn, ale z takimi rzeczami jak django, że najprawdopodobniej zainstalowałeś pip , zrobi to, gdy się spieszysz i można go użyć do inne cele (np. odczyt domyślnego pliku konfiguracyjnego z systemu plików).
foo.barpakietu:python -c "import foo.bar as _; print(_.__path__[0])"
Jak zauważyli inni, distutils.sysconfigma odpowiednie ustawienia:
import distutils.sysconfig
print distutils.sysconfig.get_python_lib()
... choć domyślnie site.pyrobi coś bardziej prymitywnego, sparafrazowanego poniżej:
import sys, os
print os.sep.join([sys.prefix, 'lib', 'python' + sys.version[:3], 'site-packages'])
(dodaje również ${sys.prefix}/lib/site-pythoni dodaje obie ścieżki sys.exec_prefix, jeśli ta stała powinna być inna).
To powiedziawszy, jaki jest kontekst? Nie powinieneś zadzierać site-packagesbezpośrednio; setuptools / distutils będą działały podczas instalacji, a twój program może działać w virtualenv, gdzie twoja ścieżka python jest całkowicie lokalna dla użytkownika, więc nie powinna zakładać bezpośredniego korzystania z systemowych pakietów witryn.
python2OSX i Ubuntu zi bez virtualenv, ale wcale nie działa python3.
python3.
Nowoczesnym sposobem stdlib jest sysconfigmoduł, dostępny w wersji 2.7 i 3.2+.
Uwaga : sysconfig( źródła ) nie należy mylić z distutils.sysconfigpodmodułem ( źródłem ) wymienionym w kilku innych odpowiedziach tutaj. Ten ostatni jest zupełnie innym modułem i nie ma get_pathsfunkcji omówionej poniżej.
Python używa obecnie ośmiu ścieżek ( dokumentów ):
- stdlib : katalog zawierający standardowe pliki bibliotek Python, które nie są specyficzne dla platformy.
- platstdlib : katalog zawierający standardowe pliki bibliotek Python, które są specyficzne dla platformy.
- platlib : katalog plików specyficznych dla witryny i platformy.
- purelib : katalog dla plików specyficznych dla witryny, nie dla platformy.
- include : katalog plików nagłówkowych niespecyficznych dla platformy.
- platinclude : katalog plików nagłówkowych specyficznych dla platformy.
- skrypty : katalog plików skryptów.
- data : katalog plików danych.
W większości przypadków użytkownicy, którzy znajdą to pytanie, byliby zainteresowani ścieżką „purelib” (w niektórych przypadkach możesz być również zainteresowany „platlib”). W przeciwieństwie do obecnie przyjętej odpowiedzi, ta metoda nadal działa niezależnie od tego, czy masz aktywowaną funkcję virtualenv.
Na poziomie systemu (jest to Python 3.7.0 w systemie 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'
Z venv dostaniesz coś takiego
>>> import sysconfig
>>> sysconfig.get_paths()['purelib']
'/private/tmp/.venv/lib/python3.7/site-packages'
Dostępny jest również skrypt powłoki, który wyświetla te szczegóły, które można wywołać, wykonując sysconfigjako moduł:
python -m sysconfig
platlib, np. /usr/local/lib/python3.6/site-packages? Tradycyjnie rzeczy lokalnie instalowane powinny wejść /usr/local.
Natywne pakiety systemowe zainstalowane z instalacją Pythona w systemach opartych na Debianie można znaleźć pod adresem:
/usr/lib/python2.7/dist-packages/
W OSX - /Library/Python/2.7/site-packages
za pomocą tego małego kodu:
from distutils.sysconfig import get_python_lib
print get_python_lib()
Listę zainstalowanych pakietów pipmożna znaleźć na stronie:
/ usr / local / bin /
Lub można po prostu napisać następujące polecenie, aby wyświetlić listę wszystkich ścieżek, w których znajdują się pakiety Pythona.
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
Uwaga: lokalizacja może się różnić w zależności od systemu operacyjnego, na przykład w 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()z instalacji systemu, stąd pakiety dist, inne instalacje pokażą pakiety strony.
Wszystkie odpowiedzi (lub: ta sama odpowiedź powtarzana w kółko) są nieodpowiednie. Co chcesz zrobić, to:
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
Ostatni wiersz pokazuje reż. Instalacji. Działa na Ubuntu, podczas gdy powyższe nie. Nie pytaj mnie o Windows lub inne dists, ale ponieważ jest to dokładnie ten sam katalog, którego domyślnie używa easy_install, prawdopodobnie jest poprawny wszędzie tam, gdzie działa easy_install (więc wszędzie, nawet Mac). Baw się dobrze. Uwaga: oryginalny kod zawiera wiele przekleństw.
easy_installi nie zawiedzie z wdziękiem, jeśli jest niedostępna, co jest nieodpowiednie :)
Uwaga dodatkowa: proponowane rozwiązanie ( distutils.sysconfig.get_python_lib()) nie działa, gdy istnieje więcej niż jeden katalog pakietów stron (zgodnie z zaleceniami tego artykułu ). Zwróci tylko główny katalog pakietów witryny.
Niestety, nie mam też lepszego rozwiązania. Wydaje się, że Python nie śledzi katalogów pakietów stron, tylko zawarte w nich pakiety.
get_python_lib()którego uruchamiany z poziomu virtualenv pokazuje pakiety strony Pythona używane do tworzenia virtualenv, a nie pakiety site virtualenv .
To działa dla mnie. Otrzymasz zarówno foldery dist-package, jak i foldery pakietów stron. Jeśli folder nie znajduje się na ścieżce Pythona, i tak nie będzie ci dobrze.
import sys;
print [f for f in sys.path if f.endswith('packages')]
Dane wyjściowe (instalacja Ubuntu):
['/home/username/.local/lib/python2.7/site-packages',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages']
Powinno to działać we wszystkich dystrybucjach w środowisku wirtualnym i poza nim ze względu na jego „niski poziom” technologiczny. Moduł os zawsze znajduje się w katalogu nadrzędnym „pakietów witryn”
import os; print(os.path.dirname(os.__file__) + '/site-packages')
Aby zmienić katalog na katalog pakietów stron używam następującego aliasu (w systemach * nix):
alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
Dodatkowa uwaga do get_python_libwspomnianej już funkcji: na niektórych platformach dla modułów specyficznych dla platformy wykorzystywane są różne katalogi (np. Moduły wymagające kompilacji). Jeśli przejdziesz plat_specific=Truedo tej funkcji, otrzymasz pakiety witryny dla pakietów specyficznych dla platformy.
from distutils.sysconfig import get_python_lib
print get_python_lib()
pip show poda wszystkie szczegóły dotyczące pakietu: https://pip.pypa.io/en/stable/reference/pip_show/ [pip show] [1]
Aby uzyskać lokalizację:
pip show <package_name>| grep Location
Odpowiedz na stare pytanie. Ale użyj do tego ipython.
pip install ipython
ipython
import imaplib
imaplib?
To da następujące dane wyjściowe dotyczące pakietu 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
Musiałem zrobić coś nieco innego dla projektu, nad którym pracowałem: znajdź względny katalog pakietów stron w stosunku do podstawowego prefiksu instalacji. Jeśli folder site-packages był w /usr/lib/python2.7/site-packagesśrodku, chciałem tę /lib/python2.7/site-packagesczęść. W rzeczywistości napotkałem systemy, w których site-packagesbył /usr/lib64, i zaakceptowana odpowiedź NIE działała na tych systemach.
Podobnie do odpowiedzi oszusta, moje rozwiązanie zagląda głęboko w trzewia Distutils, aby znaleźć ścieżkę, która faktycznie przechodzi wokół setup.py. Zrozumienie tego było dla mnie takim bólem, że nie chcę, aby ktokolwiek musiał to znowu wymyślać.
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', ''))
To powinno wydrukować coś takiego jak /Lib/site-packageslub /lib/python3.6/site-packages.
pip show <package name>