Jak znaleźć lokalizację mojego katalogu pakietów stron Python?

940

Jak znaleźć lokalizację mojego katalogu pakietów witryn?

Daryl Spitzer
źródło
63
Jeśli chcesz tylko dokładną lokalizację jednej paczki, możesz użyćpip show <package name>
joshuakcockrell

Odpowiedzi:

528

Istnieją dwa typy katalogów pakietów witryn, globalne i na użytkownika .

  1. 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"])'
  2. 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 .


Praktyczne wskazówki

  • <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.py
  • Uruchom, 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, pluggy
Peterino
źródło
17
w virtualenv znajduje się katalog pakietu serwisu. Możesz pobrać katalog dla specyficznych dla strony modułów wewnątrz / na zewnątrz virtualenv za pomocą python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"(działa to zarówno na Pythonie 2, jak i 3).
jfs
4
Miły. I zdobyć pierwszy:python -c "import site; print(site.getsitepackages()[0])"
Brent Faust
2
Powinno to być w każdym podstawowym tutorialu na temat używania Pythona. Pytam od lat i nie wiedziałem o module strony. Zaoszczędziłbym tyle bólów głowy ...
Salotz
1
Zasugerowałem zmianę w oficjalnym samouczku Pythona. Szczegółowe informacje można znaleźć w PR nr 16974 i dzięki za sugestię @salotz!
Peterino,
1
Myślę, że stackoverflow.com/a/52638888/1365918 jest łatwo najlepszą odpowiedzią na to pytanie.
kapad
652
>>> 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])

eudoksos
źródło
17
To dobrze, ale niestety ta funkcja jest dostępna tylko w python2.7. Dobre rozwiązanie, jeśli używasz Python2.7 lub nowszego, ale nie działa dla Pythona 2.6 i niższych
Dan Niero
15
python -c "importuj stronę; drukuj (site.getsitepackages ())"
Lars Schneider
29
Dostaję AttributeError: obiekt „module” nie ma atrybutu „getsitepackages”, gdy używa się go z virtualenv (python 2.7.8), jednak poniższe rozwiązanie distutils działa.
radtek
8
@radtek: w przypadku venv wykrywam venv poprzez, 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].
eudoxos
4
@radtek Znanym błędem jest to, że moduł strony nie działa dla virtualenv github.com/pypa/virtualenv/issues/355
Guillem Cucurull
319

Rozwiązanie, które:

  • poza virtualenv - zapewnia ścieżkę globalnych pakietów witryn,
  • insidue a virtualenv - zapewnia pakiety witryn virtualenv

... 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)

Daryl Spitzer
źródło
1
Czy virtualenv umożliwia znalezienie pakietów witryn?
Daryl Spitzer
10
Możesz użyć virtualenvwrapper, który ma polecenie cdsitepackages, aby bezpośrednio przejść do katalogu pakietów witryny.
john2x
6
@PiotrDobrogost: działa dla mnie w Pythonie 2.7 w virtualenv w systemie Linux
RichVel
2
Pierwszy komentarz nie ma już zastosowania: pokazało to poprawną lokalizację zarówno na zewnątrz, jak i wewnątrz virtualenv.
astrojuanlu
2
Nie działało dla mnie w systemie Windows 10 przy użyciu Linux Bash, zwraca /usr/lib/python3/dist-packageszamiast /usr/lib/python3.5/dist-packages.
Delgan,
99

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.

David Hollander
źródło
3
Jeśli pytający szuka określonej lokalizacji paczki, module.__file__jest to lepszy sposób. Jeśli próbują coś zainstalować… po prostu użyj narzędzi.
Tobu,
'/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
jfs
Jasne wyjaśnienie, aby zrozumieć różnice między dist-packagesUbuntu 2 w (L).
Timo
69

Oto, co zadziałało dla mnie:

python -m site --user-site
Ramashri
źródło
15
Dla mnie oznacza to folder, który nawet nie istnieje ( ~/.local/lib/python2.7/site-packages).
Neil Traft
1
to samo, w OS X Mavericks, mój dom .local nie jest tym, co chciałem znaleźć, a tak, tak naprawdę nie ma go tam.
radtek
Jest w moim głównym folderze / Library Musiałem ręcznie do niego nawigować, z jakiegoś powodu bezpośrednia pełna ścieżka nie działała
efwjames
jak korzystać z zainstalowanych tutaj pakietów? jeśli virtualenvto zrobię , narzeka, że ​​pakiet nie istnieje. jak wywołać pakiety zainstalowane w niestandardowej lokalizacji?
AbtPst
2
To powie ci, gdzie Python będzie szukał pakietów specyficznych dla użytkownika. Komentarze takie jak „nawet nie istnieją” i „nie to, co chciałem znaleźć”, nie mają sensu w tym kontekście.
Uczciwy Abe
28

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ć.

Sumod
źródło
>>> import pg >>> drukuj pg .__ ścieżka__ Traceback (ostatnie wywołanie ostatnio): Plik „<stdin>”, wiersz 1, w <module> AttributeError: obiekt „module” nie ma atrybutu „ ścieżka
Dannid
to działa, muszę znaleźć pakiet sklearn, aby dodać go do ścieżki PYDEV, dzięki.
berkay
użyj 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).
JL Peyret
Na podstawie tej i innych odpowiedzi możesz to zrobić w jednym wierszu z wiersza polecenia, aby uzyskać ścieżkę do foo.barpakietu:python -c "import foo.bar as _; print(_.__path__[0])"
snark
23

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.

Charles Duffy
źródło
3
działa niezawodnie z systemem python2OSX i Ubuntu zi bez virtualenv, ale wcale nie działa python3.
jitter
2
Rok 2008 był nieco wstecz - ta odpowiedź była na trzy miesiące przed wydaniem Python 3.0.
Charles Duffy
jasne, ale dziś mój komentarz może pomóc. popraw mnie, jeśli się mylę. co więcej, nie głosowałem za odrzuceniem tej odpowiedzi ani żadnej innej w odniesieniu do python3.
jitter
22

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
wim
źródło
To świetna odpowiedź, cieszę się, że nowy moduł sysconfig ułatwia to. Czy istnieje sposób na uzyskanie lokalnego prefiksu platlib, np. /usr/local/lib/python3.6/site-packages? Tradycyjnie rzeczy lokalnie instalowane powinny wejść /usr/local.
eudoxos,
Łatwo najlepsza odpowiedź na to pytanie! Dziękuję Ci. Jedyne, czego mi brakowało, to kolejność sprawdzania tych lokalizacji po napotkaniu instrukcji importu. Ponadto, czy którakolwiek z tych lokalizacji jest wstępnie przeszukiwana / buforowana podczas ładowania Pythona? Wiedząc, że byłoby to również przydatne IMO.
kapad
21

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']
fnatic_shank
źródło
Jeśli dobrze pamiętam, pakiety dist są specyficzne dla Debiana i pochodnych.
Samuel
1
@SamuelSantana masz rację. pakiety dist są specyficzne dla systemów opartych na Debianie. W tym przypadku wywołałem site.getsitepackages()z instalacji systemu, stąd pakiety dist, inne instalacje pokażą pakiety strony.
fnatic_shank
15

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.

oszust
źródło
1
Dzięki, jest to całkiem przydatne, na py3 z nawiasami do drukowania dostaje mnie /usr/local/lib/python3.4/dist-packages Próbuję się dowiedzieć, jak uzyskać /usr/lib/python3.4/dist -pakiety, więc będziesz musiał grać dalej.
Stuart Axon
4
wymaga zewnętrznej biblioteki easy_installi nie zawiedzie z wdziękiem, jeśli jest niedostępna, co jest nieodpowiednie :)
jitter
1
wprawdzie nie jest to idealne, ale zadziałało dla mnie i zajęło mi dużo czasu, aby to rozgryźć, więc umieściłem to tutaj w nadziei, że ktoś inny może wykorzystać czas, który już na to spędziłem.
oszust
13

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.

Vladimir Vagaytsev
źródło
1
Wydaje mi się, że to jest powód, dla get_python_lib()którego uruchamiany z poziomu virtualenv pokazuje pakiety strony Pythona używane do tworzenia virtualenv, a nie pakiety site virtualenv .
Piotr Dobrogost
3
@Piotr To prawdopodobnie był błąd w pliku distutils.sysconfig. Właśnie go przetestowałem i otrzymuję wewnętrzne pakiety stron, zgodnie z oczekiwaniami.
Tobu
Testowany również z Pythonem 2.7 zainstalowanym w virtualenv w systemie Linux, a metoda distutils.sysconfig działa dobrze, aby uzyskać wewnętrzne pakiety stron Pythona.
RichVel,
12

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']
just_an_old_guy
źródło
2
zaakceptowana odpowiedź jest zalecanym sposobem, więc powinieneś powiedzieć, dlaczego twój jest lepszy, ponieważ jest to trochę hack
CharlesB
Co jest złego w hakowaniu? ;) To jest prostsze i łatwiejsze do zrozumienia i zapamiętania, jeśli pracujesz interaktywnie.
just_an_old_guy
11

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'
Pyramid Newbie
źródło
10

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.

Armin Ronacher
źródło
8
from distutils.sysconfig import get_python_lib
print get_python_lib()
Florian Bösch
źródło
3

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
Sahil Agarwal
źródło
1
To nie jest katalog witryn-pakietów, ale katalog, w którym pakiet jest zainstalowany. Jest to również pomocne tylko wtedy, gdy używasz iPython, a nie dlatego, że możesz programowo uzyskać katalog instalacyjny.
danielunderwood
3

Powinieneś spróbować tego polecenia, aby określić lokalizację instalacji pip

Python 2

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

Python 3

pip3 show six | grep "Location:" | cut -d " " -f2
rdza
źródło
1

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.

MultipleMonomials
źródło
-2

Jeśli jest już dodany do PYTHONPATH, możesz również zrobić coś takiego

import sys
print('\n'.join(sys.path))
filtfilt
źródło