Python site paketleri dizinimin yerini nasıl bulabilirim?


Yanıtlar:


531

Site paketleri dizinleri, iki türü vardır küresel ve kullanıcı başına .

  1. Genel site paketleri (" dağıtım paketleri ") dizinleri, aşağıdaki sys.pathdurumlarda çalıştırılır:

    python -m site

    Daha özlü bir liste getsitepackagesiçin Python kodundaki site modülünden çalıştırın :

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

    Not: virtualenvs getsitepackages mevcut olmadığında , sys.pathyukarıdan sanalenv'nin site paketleri dizinini doğru bir şekilde listeler. Python 3'te bunun yerine sysconfig modülünü kullanabilirsiniz :

    python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'
  2. Kullanıcı başına site paketleri dizini ( PEP 370 ), Python'un yerel paketlerinizi yüklediği yerdir:

    python -m site --user-site

    Bu, var olmayan bir dizini gösteriyorsa, Python'un çıkış durumunu kontrol edin ve python -m site --helpaçıklamalara bakın .

    İpucu: Çalışan pip list --userveya her kullanıcı site paketi için pip freeze --useryüklenenlerin bir listesini verir .


Pratik İpuçları

  • <package>.__path__belirli bir paketin konumunu / konumlarını belirlemenizi sağlar: ( ayrıntılar )

    $ python -c "import setuptools as _; print(_.__path__)"
    ['/usr/lib/python2.7/dist-packages/setuptools']
    
  • <module>.__file__belirli bir modülün yerini belirlemenizi sağlar: ( fark )

    $ python3 -c "import os as _; print(_.__file__)"
    /usr/lib/python3.6/os.py
    
  • pip show <package>Debian tarzı paket bilgilerini göstermek için çalıştırın :

    $ 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
    

17
bir sanal ağda bir site paketi dizini vardır. Kullanarak sanal özelliğin içindeki / dışındaki siteye özgü modüller için dizini alabilirsiniz python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"(hem Python 2 hem de 3 üzerinde çalışır).
jfs

4
Güzel. Ve birincisini almak için:python -c "import site; print(site.getsitepackages()[0])"
Brent Faust

2
Bu, python kullanımı ile ilgili herhangi bir temel öğreticide olmalıdır. Yıllardır pythoning yapıyorum ve site modülünü bilmiyordum. Çok fazla baş ağrısından
kurtulurdum

1
Python'un resmi eğitiminde bir değişiklik önerdim. Ayrıntılar için lütfen PR # 16974'e bakın ve @salotz önerisi için teşekkürler!
Peterino

1
Sanırım stackoverflow.com/a/52638888/1365918 kolayca bu sorunun en iyi cevabı.
kapad

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

(veya yalnızca ilk öğe site.getsitepackages()[0])


17
Bu iyidir, ancak maalesef bu işlev yalnızca python2.7'den kullanılabilir. Yani, python2.7 veya üstünü kullanıyorsanız, ancak python 2.6 ve altı için çalışmıyorsanız güzel bir çözüm
Dan Niero

15
python -c "içe aktarma sitesi; yazdır (site.getsitepackages ())"
Lars Schneider

29
AttributeError: 'module' nesnesinin virtualenv (python 2.7.8) ile kullanırken 'getsitepackages' özelliği yoktur, aşağıdaki distutils çözümü olsa çalışır.
radtek

8
@radtek: venv için, venv aracılığıyla tespit hasattr(sys,'real_prefix')ve sonra sezgisel olarak site paketleri belirlemek [p for p in sys.path if p.endswith('site-packages')][-1](artı yapmadan önce bir tane olup olmadığını kontrol edin [-1].
eudoxos

4
@radtek Site modülünün virtualenv için çalışmadığı bilinen bir hatadır github.com/pypa/virtualenv/issues/355
Guillem Cucurull

319

Bir çözüm:

  • virtualenv dışında - global site paketlerinin yolunu sağlar,
  • bir virtualenv insidue - virtualenv'in site paketlerini sağlar

... bu tek astarlı:

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

Okunabilirlik için biçimlendirilmiş (tek astar olarak kullanmak yerine), aşağıdakine benzer:

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


Kaynak: "Django Nasıl Kurulur" belgelerinin çok eski bir sürümü (bu sadece Django kurulumundan daha fazlası için yararlı olsa da)


1
Virtualenv site paketlerini bulmanın bir yolunu sunuyor mu?
Daryl Spitzer

10
cdsitepackagesDoğrudan ortamın site paketleri dizinine geçmek için , komutu olan virtualenvwrapper komutunu kullanabilirsiniz .
john2x

6
@PiotrDobrogost: Benim için Linux'ta bir
sanal ortamda

2
İlk yorum artık geçerli değil: Bu, bir virtualenv'in içinde ve dışında doğru yeri gösterdi.
astrojuanlu

2
Linux bash kullanarak Windows 10'da benim için çalışmadı, bunun /usr/lib/python3/dist-packagesyerine geri döner /usr/lib/python3.5/dist-packages.
Delgan

99

Ubuntu için ,

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

...Doğru değil.

Sizi işaret edecek /usr/lib/pythonX.X/dist-packages

Bu klasör yalnızca işletim sisteminizin programların çalışması için otomatik olarak yüklediği paketleri içerir.

Ubuntu üzerinde , site paketleri o setup_tools aracılığıyla yüklenmiş paketleri içerir klasörü \ easy_install \ pip olacak/usr/local/lib/pythonX.X/dist-packages

Kullanım durumu kurulum veya kaynak kodunu okumakla ilgiliyse, ikinci klasör muhtemelen daha yararlıdır.

Ubuntu kullanmıyorsanız, ilk kod kutusunu terminale güvenli bir şekilde yapıştırabilirsiniz.


3
Eğer asker belli bir paketin peşindeyse module.__file__daha iyi bir yoldur. Bir şeyler kurmaya çalışıyorlarsa ... sadece araçları kullanın.
Tobu

'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages()( listede sonra da olsa /usr/local/...). Sadece /usr/localüzerinden bir şey alırsınız sudo pipve sudo pipkendi dağıtımınızı yapmaya karar vermedikçe Ubuntu'da kullanmamalısınız : kullanırsanız sudo pip, mevcut veya gelecekteki python modüllerinin tüm bağımlılıklarının bağlı sudo aptveya sudo pipuyumlu olduğundan emin olmak sizin sorumluluğunuzdadır . Çözmek için hangi sorunun virtualenvyaratıldığını
jfs

dist-packages(L) Ubuntu'daki 2'nin farklarını anlamak için açık bir açıklama .
Timo

69

Benim için işe yarayan buydu:

python -m site --user-site

15
Benim için bu, var olmayan bir klasöre işaret ediyor ( ~/.local/lib/python2.7/site-packages).
Neil Traft

1
Aynı, OS X Mavericks'te, evim. yerel bulmamı istediğim şey değil, evet zaten orada değil.
radtek

Onun ana / Kütüphane klasöründe ben manuel olarak ona gitmek zorunda kaldı, nedense doğrudan tam yol çalışma değildi
efwjames

burada kurulu paketleri nasıl kullanırım? eğer ben virtualenvpaketin mevcut olmadığını şikayet ediyor. özel bir konuma yüklenen paketleri nasıl çağırabilirim?
AbtPst

2
Bu size Python'un kullanıcıya özel paketleri nerede arayacağını söyler. "Hatta yok" ve "bulmasını istediğim gibi değil" gibi yorumlar bu bağlamda anlamlı değil.
Dürüst Abe

28

Diyelim ki 'django' paketini kurdunuz. içe aktarın ve dir (django) yazın. Size, bu modülün tüm işlevlerini ve özelliklerini gösterecektir. Python yorumlayıcısını yazın -

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

Mercurial yüklediyseniz aynı şeyi yapabilirsiniz.

Bu Kar Leoparı için. Ama genel olarak da çalışması gerektiğini düşünüyorum.


>>> import pg >>> print pg .__ path__ Geri izleme (en son çağrı son): <module> AttributeError: 'module' nesnesinin ' path ' özelliği yok
Dannid

işe yarıyor, ben PYDEV yoluna eklemek için sklearn paketi bulmalıyım, teşekkürler.
berkay

django.__file__bunun yerine kullanın __path__. ve, hayır, bunun site paketleri ile ilgisi olduğu bir garanti değildir, ancak django gibi şeylerle büyük olasılıkla pip kurmuş olursanız, aceleniz olduğunda ve bunun için kullanılabilir başka amaçlar da (örneğin dosya sisteminden varsayılan bir yapılandırma dosyası okumak).
JL Peyret

Bu ve diğer yanıtlara dayanarak, foo.barpaketinizin yolunu almak için bunu komut satırından bir satırda yapabilirsiniz :python -c "import foo.bar as _; print(_.__path__[0])"
snark

23

Diğerlerinin belirttiği gibi, distutils.sysconfigilgili ayarlara sahiptir:

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

... varsayılan değer site.pybiraz daha kaba, aşağıda açıklanan bir şey yapar:

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

(bu sabitin farklı olması durumunda ${sys.prefix}/lib/site-pythonher iki yolu da ekler ve ekler sys.exec_prefix).

Bununla birlikte, bağlam nedir? site-packagesDoğrudan seninle uğraşmamalısın ; setuptools / distutils kurulum için çalışır ve programınız pythonpath'inizin tamamen kullanıcı-yerel olduğu bir sanal ortamda çalışıyor olabilir, bu yüzden sistem site paketlerinin de doğrudan kullanılmasını varsaymamalıdır.


3
python2osen ve ubuntu üzerinde virtualenv ile ve sanal olmayan ama hiç değil güvenilir çalışır python3.
titreşim

2
2008 bir süre önce oldu - bu cevap Python 3.0'ın yayınlanmasından üç ay önceydi.
Charles Duffy

emin, ama bugün yorumum yardımcı olabilir. yanılıyorsam düzelt. dahası, bu cevabı ya da başka herhangi bir şeyi küçümsemedim python3.
titreşim

22

Modern bir stdlib yolu, sysconfig2.7 ve 3.2+ sürümlerinde bulunan modülü kullanıyor .

Not : sysconfig( kaynak ), diğer birkaç distutils.sysconfigcevapta bahsedilen alt modül ( kaynak ) ile karıştırılmamalıdır . İkincisi tamamen farklı bir modüldür ve get_pathsaşağıda tartışılan işlevden yoksundur .

Python şu anda sekiz yol ( doküman ) kullanıyor:

  • stdlib : platforma özgü olmayan standart Python kütüphane dosyalarını içeren dizin.
  • platstdlib : platforma özgü standart Python kitaplık dosyalarını içeren dizin.
  • platlib : siteye özgü, platforma özgü dosyalar için dizin.
  • purelib : siteye özgü, platforma özgü olmayan dosyalar için dizin.
  • include : platforma özgü olmayan üstbilgi dosyaları dizini.
  • platinclude : platforma özgü başlık dosyaları dizini.
  • komut dosyaları : komut dosyaları için dizin.
  • data : veri dosyaları dizini.

Çoğu durumda, bu soruyu bulan kullanıcılar 'purelib' yolu ile ilgilenir ( bazı durumlarda 'platlib' ile de ilgilenebilirsiniz). Geçerli kabul edilen cevabın aksine, bu yöntem aktif bir sanal ağınız olup olmadığına bakılmaksızın hala çalışır.

Sistem düzeyinde (bu, Mac OS'de Python 3.7.0'dır):

>>> import sysconfig
>>> sysconfig.get_paths()['purelib']
'/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages'

Bir venv ile böyle bir şey elde edersiniz

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

Bu ayrıntıları görüntülemek için sysconfigbir modül olarak da çalıştırabileceğiniz bir kabuk komut dosyası da mevcuttur :

python -m sysconfig

Bu harika bir cevap, yeni sysconfig modülünün bunu kolaylaştırdığı için mutluyum. Yerel öneki almanın bir yolu var mı platlib, örneğin /usr/local/lib/python3.6/site-packages? Geleneksel olarak, yerel olarak kurulan şeyler içeri girmelidir /usr/local.
eudoxos

Kolayca bu soruya en iyi cevap! Teşekkür ederim. Eksik bulduğum tek şey, bir içe aktarma ifadesi ile karşılaşıldığında bu konumların kontrol edildiği sıralamadır. Ayrıca, bu konumlardan herhangi biri python yüklendiğinde önceden aranır / önbelleğe alınır mı? Bunu bilmek de yararlı IMO olacaktır.
kapad

21

Debian tabanlı sistemlerde python yüklemesi ile yüklenen yerel sistem paketleri şu adreste bulunabilir:

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

OSX'te - /Library/Python/2.7/site-packages

bu küçük kodu kullanarak:

from distutils.sysconfig import get_python_lib
print get_python_lib()

Ancak, üzerinden yüklenen paketlerin listesini pipşu adreste bulabilirsiniz:

/ Usr / local / bin /

Veya python paketlerinin bulunduğu tüm yolları listelemek için aşağıdaki komutu yazabilirsiniz.

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

Not: konum, OSX'teki gibi işletim sisteminize bağlı olarak değişebilir

>>> 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']

Doğru hatırlıyorsam dist-paketleri Debian ve türevlerine özgüdür.
Samuel

1
@SamuelSantana haklısın. dağıtım paketleri debian tabanlı sistemlere özgüdür. Bu durumda site.getsitepackages()sistem kurulumundan çağrıldım dolayısıyla dağıtım paketleri, diğer kurulumlar site paketlerini gösterecektir.
fnatic_shank

15

Tüm cevaplar (veya: tekrar tekrar aynı cevap) yetersizdir. Yapmak istediğiniz şey şudur:

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

Son satır kurulum talimatını gösterir. Ubuntu üzerinde çalışıyor, ancak yukarıdakiler çalışmıyor. Bana pencereler veya diğer dağıtımlar hakkında soru sormayın, ancak easy_install'un varsayılan olarak kullandığı dizinle aynı olduğundan, easy_install'un çalıştığı her yerde (yani, her yerde, hatta mac'larda) muhtemelen doğru. İyi eğlenceler. Not: orijinal kodun içinde birçok küfür vardır.


1
Teşekkürler, bu oldukça yararlı, baskı için parantez ile py3 bana /usr/local/lib/python3.4/dist-packages alır /usr/lib/python3.4/dist almak için nasıl çalışıyorum -paketler daha fazla oynamak zorunda kalacak.
Stuart Axon

4
harici kütüphane gerektirir easy_installve kullanılamazsa zarifçe başarısız olmaz ki bu da yetersizdir :)
titreşim

1
Gerçekten, bu mükemmel değil, ama benim için çalıştı ve anlaması çok zaman aldı, bu yüzden başka birinin zaten harcadığım zamana göre inşa edebileceği umuduyla buraya koydum.
dolandırıcı

13

Yan not: distutils.sysconfig.get_python_lib()Birden fazla site paketi dizini olduğunda ( bu makalede önerildiği gibi) önerilen çözüm ( ) çalışmaz . Yalnızca ana site paketleri dizinini döndürür.

Ne yazık ki, daha iyi bir çözümüm yok. Python site paketleri dizinlerini takip etmiyor, sadece içindeki paketleri takip ediyor.


1
Bunun nedeni sanırım get_python_lib()Virtualenv gösterileri içinden yürütülüyor yaparken site paketleri Python Virtualenv oluşturmak için kullanılan ve VIRTUALENV en site paketleri .
Piotr Dobrogost

3
@Piotr Bu muhtemelen distutils.sysconfig dosyasında bir hataydı. Ben sadece test bir beklediğim gibi, iç site paketleri almak.
Tobu

Ayrıca Linux üzerinde bir sanal ortamda yüklü Python 2.7 ile test edildi ve distutils.sysconfig yöntemi, iç Python'un site paketlerini almak için iyi çalışıyor.
RichVel

12

Bu benim için çalışıyor. Hem dağıtım paketleri hem de site paketleri klasörlerini alırsınız. Klasör Python'un yolunda değilse, zaten çok iyi olmayacaktır.

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

Çıkış (Ubuntu kurulumu):

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

2
kabul edilen cevap önerilen yoldur, bu yüzden neden daha iyi olduğunu söylemelisiniz, çünkü biraz hack
CharlesB

Bir hack ile ilgili sorun nedir? ;) Etkileşimli çalışıp çalışmadığınızı anlamak ve hatırlamak daha basit ve kolaydır.
just_an_old_guy

11

Bu, "düşük teknoloji" doğası nedeniyle sanal ortama giren ve çıkan tüm dağıtımlar üzerinde çalışmalıdır. Os modülü her zaman 'site paketleri'nin üst dizininde bulunur

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

Site-paketleri dizin dir değiştirmek için aşağıdaki diğer adı (* nix sistemlerde) kullanın:

alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'

10

Daha get_python_libönce bahsedilen işleve ek bir not : bazı platformlarda platforma özgü modüller için farklı dizinler kullanılır (örneğin: derleme gerektiren modüller). Eğer plat_specific=Trueişleve geçerseniz platforma özel paketler için site paketleri alırsınız.




3

Eski soruya cevap. Ama bunun için ipython kullanın.

pip install ipython
ipython 
import imaplib
imaplib?

Bu imaplib paketi hakkında şu çıktıyı verecektir -

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

1
Bu site paketleri dizini değil, paketin yüklendiği dizin. Bu aynı zamanda yalnızca iPython kullanıyorsanız ve programlı olarak bir yükleme dizini alamadığınız için yararlıdır.
danielunderwood

3

Pip'in kurulum konumunu belirlemek için bu komutu denemelisiniz

Python 2

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

Python 3

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

1

Üzerinde çalıştığım bir proje için biraz farklı bir şey yapmak zorunda kaldım: temel kurulum önekine göre göreceli site paketleri dizinini bulun . Site-paketleri klasörü varsa, parçayı /usr/lib/python2.7/site-packagesistedim /lib/python2.7/site-packages. Ben, aslında, sistemlerini karşılaştım site-packagesoldu /usr/lib64ve kabul cevap bu sistemlerde işe yaramadı.

Cheater'ın cevabına benzer şekilde, çözümüm aslında içeriden geçen yolu bulmak için Distutils'in bağırsaklarına derinlemesine bakıyor setup.py. Kimsenin bunu bir daha çözmesini istemediğimi anlamak çok acı vericiydi.

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', ''))

Yani böyle bir şey yazdırmalısınız /Lib/site-packagesveya /lib/python3.6/site-packages.


-2

Eğer zaten eklenmişse, bunun PYTHONPATHgibi bir şey de yapabilirsiniz.

import sys
print('\n'.join(sys.path))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.