it-swarm-eu.dev

Jak najdu umístění adresáře Python site-packages?

Jak zjistím umístění mého adresáře balíčků site-packages?

752
Daryl Spitzer

Existují dva typy adresářů balíčků webů: globální a na uživatele.

  1. Global site-packages (" dist-packages ") adresáře jsou uvedeny v sys.path při spuštění:

    python -m site
    

    Podrobnější seznam je uveden v getsitepackages z modulu site v kódu Python:

    python -c "import site; print(site.getsitepackages())"
    

    Pozn .: S virtualenvs getsitepackages není k dispozici , sys.path shora bude správně zobrazovat adresář virtualenv site-packages.

  2. Adresář balíků per user ( PEP 370 ) je místo, kde Python instaluje lokální balíčky:

    python -m site --user-site
    

    Pokud tento odkaz ukazuje na neexistující adresář, zkontrolujte stav ukončení programu Python a pro vysvětlení viz python -m site --help.

    Tip: _ pip list --user nebo pip freeze --user vám dává seznam všech nainstalovaných balíčků na uživatele site-packages.


Praktické tipy

  • <package>.__path__ vám umožní určit umístění konkrétního balíčku: ( details )

    $ python -c "import setuptools as _; print(_.__path__)"
    ['/usr/lib/python2.7/dist-packages/setuptools']
    
  • <module>.__file__ vám umožní určit umístění konkrétního modulu: ( rozdíl )

    $ python3 -c "import os as _; print(_.__file__)"
    /usr/lib/python3.6/os.py
    
  • Chcete-li zobrazit informace o balíčku ve stylu Debianu, spusťte soubor pip show <package>:

    $ 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
    
256
Peterino
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

(nebo jen první položka s site.getsitepackages()[0])

627
eudoxos

Od "Jak nainstalovat Django" dokumentaci (i když je to užitečné pro více než jen Django instalaci) - spusťte z Shell následující:

python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"

Formátovaný pro čitelnost (spíše než pro použití jako jeden řádek), který vypadá takto:

from distutils.sysconfig import get_python_lib
print(get_python_lib())
301
Daryl Spitzer

Pro Ubuntu ,

python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"

...není správné.

Ukáže vás na /usr/lib/pythonX.X/dist-packages

Tato složka obsahuje pouze balíčky, které váš operační systém automaticky nainstaloval pro programy ke spuštění.

Na ubuntu , bude složka site-packages, která obsahuje balíčky instalované přes setup_tools easy_install, v souboru /usr/local/lib/pythonX.X/dist-packages

Druhá složka je pravděpodobně užitečnější, pokud se případ použití týká instalace nebo čtení zdrojového kódu.

Pokud nepoužíváte Ubuntu, budete pravděpodobně bezpečně kopírovat první kódové pole do terminálu.

98
David Hollander

Tohle pro mě fungovalo:

python -m site --user-site
64
Ramashri

Řekněme, že jste nainstalovali balíček „Django“. importujte a zadejte dir (Django). Ukáže vám všechny funkce a atributy tohoto modulu. Zadejte interpreter python - 

>>> import Django
>>> dir(Django)
['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'get_version']
>>> print Django.__path__
['/Library/Python/2.6/site-packages/Django']

Totéž můžete udělat, pokud jste nainstalovali Mercurial.

Toto je pro Snow Leopard. Ale myslím, že by to mělo fungovat i obecně.

22
Sumod

Jak poznamenali jiní, distutils.sysconfig má příslušná nastavení:

import distutils.sysconfig
print distutils.sysconfig.get_python_lib()

... i když výchozí site.py dělá něco trochu hrubšího, parafrázuje níže:

import sys, os
print os.sep.join([sys.prefix, 'lib', 'python' + sys.version[:3], 'site-packages'])

(také přidává ${sys.prefix}/lib/site-python a přidává obě cesty pro sys.exec_prefix také, pokud by tato konstanta byla odlišná).

Co to znamená? Neměli byste se hádat přímo s vaším site-packages přímo; setuptools/distutils budou fungovat pro instalaci a váš program může být spuštěn ve virtuálním prostředí, kde je vaše pythonpath zcela lokální, takže by nemělo přímo předpokládat použití systémových balíčků.

21
Charles Duffy

Nativní systémové balíčky instalované s instalací python v systémech založených na Debianu naleznete na adrese:

/usr/lib/python2.7/dist-packages/

V OSX - /Library/Python/2.7/site-packages

pomocí tohoto malého kódu:

from distutils.sysconfig import get_python_lib
print get_python_lib()

Seznam balíčků nainstalovaných pomocí pip však lze nalézt na adrese:

/ usr/local/bin /

Nebo je možné jednoduše napsat následující příkaz, aby se zobrazily všechny cesty, kde jsou pythonové balíčky.

>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

Poznámka: umístění se může lišit v závislosti na operačním systému, například v 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']
15
fnatic_shank

Všechny odpovědi (nebo stejná odpověď opakovaná znovu a znovu) jsou nedostatečné. To, co chcete udělat, je toto:

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

Poslední řádek zobrazuje adresář instalace. Pracuje na Ubuntu, zatímco výše uvedené ne. Neptejte se mě na okna nebo jiné dists, ale protože je to přesně stejný adresář, který easy_install používá ve výchozím nastavení, je to pravděpodobně správné všude tam, kde easy_install funguje (tak, všude, dokonce i mac). Bavte se. Poznámka: originální kód má mnoho příčin v něm.

13
cheater

Postranní poznámka: Navrhované řešení (distutils.sysconfig.get_python_lib()) nefunguje, pokud existuje více než jeden adresář site-packages (jako doporučený tímto článkem ). Vrátí pouze hlavní adresář balíčků stránek.

Bohužel nemám lepší řešení. Python nezdá, že by sledoval adresáře balíčků stránek, pouze balíčky v nich.

11
user147100

To funguje pro mě. Dostane vás jak dist-balíčky, tak site-packages složky. stejně dobře.

import sys; 
print [f for f in sys.path if f.endswith('packages')]

Výstup (instalace Ubuntu):

['/home/username/.local/lib/python2.7/site-packages',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages']
9
just_an_old_guy

Dodatečná poznámka ke zmíněné funkci get_python_lib: na některých platformách se pro moduly specifické pro platformu používají různé adresáře (např. Moduly, které vyžadují kompilaci). Pokud předáte funkci plat_specific=True, získáte balíčky stránek pro balíčky specifické pro platformu.

8
Armin Ronacher

To by mělo fungovat na všech distribucích ve virtuálním prostředí i mimo něj, a to díky své „low-tech“ povaze. Modul os je vždy umístěn v rodičovském adresáři 'site-packages'

import os; print(os.path.dirname(os.__file__) + '/site-packages')

Chcete-li změnit adresář dir na adresář site-packages, používám následující alias (v systémech * nix):

alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
8
Pyramid Newbie
from distutils.sysconfig import get_python_lib
print get_python_lib()
7
Florian Bösch

pip show zobrazí všechny podrobnosti o balíčku: https://pip.pypa.io/en/stable/reference/pip_show/ [pip show] [1]

Umístění:

pip show <package_name>| grep Location
3
Sourabh Potnis

Moderní stdlib způsob používá sysconfig modul, dostupný ve verzi 2.7 a 3.2+. Python v současné době používá osm cest ( docs ):

  • stdlib: adresář obsahující standardní soubory knihovny Python, které nejsou specifické pro platformu.
  • platstdlib: adresář obsahující standardní soubory knihovny Python, které jsou specifické pro platformu.
  • platlib: adresář pro stránky specifické, pro platformu specifické soubory.
  • purelib: adresář pro site-specific, non-platform-specific soubory.
  • include: adresář pro soubory záhlaví, které nejsou specifické pro platformu.
  • platinclude: adresář pro soubory záhlaví specifické pro platformu.
  • scripts: adresář pro soubory skriptů.
  • data: adresář pro datové soubory.

Ve většině případů by se uživatelé, kteří tuto otázku nalezli, zajímali o cestu „purelib“ (v některé případy . Na rozdíl od aktuálně přijaté odpovědi by tato metoda neměla být v závislosti na tom, zda máte aktivovaný virtuální server, či nikoli.

Na systémové úrovni (toto je Python 3.7.0 na 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'

S venv, dostanete něco takového 

>>> import sysconfig                                                                                                                                                
>>> sysconfig.get_paths()['purelib']                                                                                                                                
'/private/tmp/.venv/lib/python3.7/site-packages'

Skript Shell je také k dispozici pro zobrazení těchto podrobností, které můžete vyvolat provedením sysconfig jako modulu:

python -m sysconfig

Poznámka:sysconfig ( zdroj ) nesmí být zaměňováno s submodulem distutils.sysconfig ( source ) zmíněným v několika dalších odpovědích zde. Jedná se o zcela odlišný modul, kterému chybí výše popsaná funkce get_paths.

3
wim

Odpověď na starou otázku. Ale k tomu použijte ipython. 

pip install ipython
ipython 
import imaplib
imaplib?

To poskytne následující výstup o balíčku 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
2
Sahil Agarwal

Musel jsem udělat něco poněkud odlišného pro projekt, na kterém jsem pracoval: najděte adresář relativní site-packages vzhledem k základní předponě instalace. Pokud byla složka site-packages v /usr/lib/python2.7/site-packages, chtěl jsem /lib/python2.7/site-packages část. Ve skutečnosti jsem se setkal se systémy, kde site-packages bylo v /usr/lib64 a přijatá odpověď na těchto systémech nefungovala. 

Podobně jako odpověď cheatera, mé řešení nahlédne hluboko do vnitřností Distutils, abych našel cestu, která ve skutečnosti projde kolem setup.py. Byla to taková bolest, když jsem zjistil, že nechci, aby to někdo někdy musel znovu zjistit.

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 by mělo vytisknout něco jako /Lib/site-packages nebo /lib/python3.6/site-packages.

0
MultipleMonomials

Pokud je již přidán do PYTHONPATH, můžete také něco udělat

import sys
print('\n'.join(sys.path))
0
filtfilt

Tento příkaz byste měli zkusit určit umístění instalace pipu

Python 2

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

Python 3

pip3 show six | grep "Location:" | cut -d " " -f2
0
rust