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.path
po uruchomieniu:
python -m site
Dla bardziej zwięzły listy prowadzonej getsitepackages
z modułem miejscu w kodzie Pythona:
python -c 'import site; print(site.getsitepackages())'
Uwaga: Z virtualenvs getitepackages nie jest dostępny , sys.path
z 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 --help
wyjaśnienia.
Wskazówka: Uruchamianie pip list --user
lub pip freeze --user
daje 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.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
python -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-packages
zamiast /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/local
za pośrednictwem sudo pip
i nie powinieneś używać sudo pip
na 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 apt
lub sudo pip
są kompatybilne. Zastanów się, jaki problem virtualenv
został rozwiązany
dist-packages
Ubuntu 2 w (L).
Oto, co zadziałało dla mnie:
python -m site --user-site
~/.local/lib/python2.7/site-packages
).
virtualenv
to 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.bar
pakietu:python -c "import foo.bar as _; print(_.__path__[0])"
Jak zauważyli inni, distutils.sysconfig
ma odpowiednie ustawienia:
import distutils.sysconfig
print distutils.sysconfig.get_python_lib()
... choć domyślnie site.py
robi 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-python
i dodaje obie ścieżki sys.exec_prefix
, jeśli ta stała powinna być inna).
To powiedziawszy, jaki jest kontekst? Nie powinieneś zadzierać site-packages
bezpoś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.
python2
OSX i Ubuntu zi bez virtualenv, ale wcale nie działa python3
.
python3
.
Nowoczesnym sposobem stdlib jest sysconfig
moduł, dostępny w wersji 2.7 i 3.2+.
Uwaga : sysconfig
( źródła ) nie należy mylić z distutils.sysconfig
podmodułem ( źródłem ) wymienionym w kilku innych odpowiedziach tutaj. Ten ostatni jest zupełnie innym modułem i nie ma get_paths
funkcji 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 sysconfig
jako 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 pip
moż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_install
i 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_lib
wspomnianej 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=True
do 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-packages
część. W rzeczywistości napotkałem systemy, w których site-packages
był /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-packages
lub /lib/python3.6/site-packages
.
pip show <package name>