Yanıtlar:
Site paketleri dizinleri, iki türü vardır küresel ve kullanıcı başına .
Genel site paketleri (" dağıtım paketleri ") dizinleri, aşağıdaki sys.path
durumlarda çalıştırılır:
python -m site
Daha özlü bir liste getsitepackages
iç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.path
yukarı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"])'
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 --help
açıklamalara bakın .
İpucu: Çalışan pip list --user
veya her kullanıcı site paketi için pip freeze --user
yüklenenlerin bir listesini verir .
<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
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
(hem Python 2 hem de 3 üzerinde çalışır).
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']
(veya yalnızca ilk öğe site.getsitepackages()[0]
)
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]
.
Bir çözüm:
... 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)
cdsitepackages
Doğrudan ortamın site paketleri dizinine geçmek için , komutu olan virtualenvwrapper komutunu kullanabilirsiniz .
/usr/lib/python3/dist-packages
yerine geri döner /usr/lib/python3.5/dist-packages
.
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.
module.__file__
daha iyi bir yoldur. Bir şeyler kurmaya çalışıyorlarsa ... sadece araçları kullanın.
'/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 pip
ve sudo pip
kendi 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 apt
veya sudo pip
uyumlu olduğundan emin olmak sizin sorumluluğunuzdadır . Çözmek için hangi sorunun virtualenv
yaratıldığını
dist-packages
(L) Ubuntu'daki 2'nin farklarını anlamak için açık bir açıklama .
Benim için işe yarayan buydu:
python -m site --user-site
~/.local/lib/python2.7/site-packages
).
virtualenv
paketin mevcut olmadığını şikayet ediyor. özel bir konuma yüklenen paketleri nasıl çağırabilirim?
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.
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).
foo.bar
paketinizin yolunu almak için bunu komut satırından bir satırda yapabilirsiniz :python -c "import foo.bar as _; print(_.__path__[0])"
Diğerlerinin belirttiği gibi, distutils.sysconfig
ilgili ayarlara sahiptir:
import distutils.sysconfig
print distutils.sysconfig.get_python_lib()
... varsayılan değer site.py
biraz 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-python
her iki yolu da ekler ve ekler sys.exec_prefix
).
Bununla birlikte, bağlam nedir? site-packages
Doğ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.
python2
osen ve ubuntu üzerinde virtualenv ile ve sanal olmayan ama hiç değil güvenilir çalışır python3
.
python3
.
Modern bir stdlib yolu, sysconfig
2.7 ve 3.2+ sürümlerinde bulunan modülü kullanıyor .
Not : sysconfig
( kaynak ), diğer birkaç distutils.sysconfig
cevapta bahsedilen alt modül ( kaynak ) ile karıştırılmamalıdır . İkincisi tamamen farklı bir modüldür ve get_paths
aş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 sysconfig
bir modül olarak da çalıştırabileceğiniz bir kabuk komut dosyası da mevcuttur :
python -m sysconfig
platlib
, örneğin /usr/local/lib/python3.6/site-packages
? Geleneksel olarak, yerel olarak kurulan şeyler içeri girmelidir /usr/local
.
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']
site.getsitepackages()
sistem kurulumundan çağrıldım dolayısıyla dağıtım paketleri, diğer kurulumlar site paketlerini gösterecektir.
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.
easy_install
ve kullanılamazsa zarifçe başarısız olmaz ki bu da yetersizdir :)
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.
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 .
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']
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'
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=True
işleve geçerseniz platforma özel paketler için site paketleri alırsınız.
from distutils.sysconfig import get_python_lib
print get_python_lib()
pip show bir paket hakkında tüm detayları verecektir: https://pip.pypa.io/en/stable/reference/pip_show/ [pip show] [1]
Konumu almak için:
pip show <package_name>| grep Location
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
Ü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-packages
istedim /lib/python2.7/site-packages
. Ben, aslında, sistemlerini karşılaştım site-packages
oldu /usr/lib64
ve 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-packages
veya /lib/python3.6/site-packages
.
pip show <package name>