Jawaban:
Ada dua jenis direktori paket situs, global dan per pengguna .
Direktori global paket-situs (" paket-dist ") terdaftar sys.pathketika Anda menjalankan:
python -m site
Untuk daftar yang lebih ringkas jalankan getsitepackagesdari modul situs dalam kode Python:
python -c 'import site; print(site.getsitepackages())'
Catatan: Dengan virtualenvs, getitepackages tidak tersedia , sys.pathdari atas akan mencantumkan direktori paket situs virtualenv dengan benar. Dalam Python 3, Anda dapat menggunakan modul sysconfig sebagai gantinya:
python3 -c 'import sysconfig; print(sysconfig.get_paths()["purelib"])'The per pengguna situs-paket direktori ( PEP 370 ) adalah di mana Python menginstal paket lokal Anda:
python -m site --user-site
Jika ini menunjuk ke direktori yang tidak ada, periksa status keluar dari Python dan lihat python -m site --helppenjelasannya.
Petunjuk: Menjalankan pip list --useratau pip freeze --usermemberi Anda daftar semua paket per situs yang diinstal per pengguna .
<package>.__path__memungkinkan Anda mengidentifikasi lokasi paket tertentu: ( detail )
$ python -c "import setuptools as _; print(_.__path__)"
['/usr/lib/python2.7/dist-packages/setuptools']<module>.__file__memungkinkan Anda mengidentifikasi lokasi modul tertentu: ( perbedaan )
$ python3 -c "import os as _; print(_.__file__)"
/usr/lib/python3.6/os.pyJalankan pip show <package>untuk menampilkan informasi paket gaya-Debian:
$ 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, pluggypython -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"(ini juga berfungsi pada Python 2 dan 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']
(atau hanya item pertama dengan site.getsitepackages()[0])
hasattr(sys,'real_prefix')dan kemudian menentukan paket-paket situs secara heuristik [p for p in sys.path if p.endswith('site-packages')][-1](plus periksa apakah ada satu yang ditemukan sebelum melakukan [-1].
Solusi yang:
... apakah ini satu-baris:
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"
Diformat agar mudah dibaca (daripada digunakan sebagai satu-liner), yang terlihat seperti berikut:
from distutils.sysconfig import get_python_lib
print(get_python_lib())
Sumber: dokumentasi "How to Install Django" versi sangat lama (meskipun ini berguna untuk lebih dari sekadar instalasi Django)
cdsitepackages, untuk secara langsung berubah menjadi direktori paket situs lingkungan.
/usr/lib/python3/dist-packagesbukan /usr/lib/python3.5/dist-packages.
Untuk Ubuntu ,
python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
...tidak benar.
Ini akan mengarahkan Anda ke /usr/lib/pythonX.X/dist-packages
Folder ini hanya berisi paket yang sistem operasi Anda terinstal secara otomatis untuk menjalankan program.
Di ubuntu , folder situs-paket yang berisi paket-paket yang diinstal melalui setup_tools \ easy_install \ pip akan dimasukkan/usr/local/lib/pythonX.X/dist-packages
Folder kedua mungkin yang lebih berguna jika use case terkait dengan instalasi atau membaca kode sumber.
Jika Anda tidak menggunakan Ubuntu, Anda mungkin dengan aman menyalin-paste kotak kode pertama ke terminal.
module.__file__adalah cara yang lebih baik. Jika mereka mencoba menginstal sesuatu ... cukup gunakan alat.
'/usr/lib/pythonX.X/dist-packages' in site.getsitepackages()di Ubuntu (meskipun setelah /usr/local/... dalam daftar). Anda hanya mendapatkan sesuatu /usr/localmelalui sudo pipdan Anda tidak boleh menggunakan sudo pipdi Ubuntu kecuali Anda memutuskan untuk membuat distribusi Anda sendiri: jika Anda menggunakan sudo pip, itu adalah tanggung jawab Anda untuk memastikan bahwa semua dependensi modul python saat ini dan masa depan diinstal melalui sudo aptatau sudo pipkompatibel. Pertimbangkan masalah apa virtualenvyang diciptakan untuk dipecahkan
dist-packagesin (L) Ubuntu.
Inilah yang bekerja untuk saya:
python -m site --user-site
~/.local/lib/python2.7/site-packages).
virtualenvmengeluh bahwa paket tersebut tidak ada. bagaimana cara mengaktifkan paket yang diinstal di lokasi khusus?
Katakanlah Anda telah menginstal paket 'Django'. impor dan ketik dir (Django). Ini akan menunjukkan kepada Anda, semua fungsi dan atribut dengan modul itu. Ketik juru bahasa python -
>>> import django
>>> dir(django)
['VERSION', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'get_version']
>>> print django.__path__
['/Library/Python/2.6/site-packages/django']
Anda dapat melakukan hal yang sama jika Anda menginstal lincah.
Ini untuk Snow Leopard. Tetapi saya pikir itu harus bekerja secara umum juga.
django.__file__untuk ini daripada __path__. dan, tidak, itu bukan jaminan bahwa ini ada hubungannya dengan paket-situs, tetapi dengan hal-hal seperti Django, bahwa Anda kemungkinan besar akan menginstal pip , itu akan dilakukan ketika Anda sedang terburu-buru dan dapat digunakan untuk tujuan lain juga (membaca file konfigurasi default dari sistem file misalnya).
foo.barpaket Anda :python -c "import foo.bar as _; print(_.__path__[0])"
Seperti yang telah dicatat orang lain, distutils.sysconfigmemiliki pengaturan yang relevan:
import distutils.sysconfig
print distutils.sysconfig.get_python_lib()
... meskipun defaultnya site.pymelakukan sesuatu yang sedikit lebih kasar, diparafrasekan di bawah ini:
import sys, os
print os.sep.join([sys.prefix, 'lib', 'python' + sys.version[:3], 'site-packages'])
(Ini juga menambah ${sys.prefix}/lib/site-pythondan menambahkan kedua jalur sys.exec_prefixjuga, jika konstanta berbeda).
Yang mengatakan, apa konteksnya? Anda tidak boleh main-main dengan Anda site-packagessecara langsung; setuptools / distutils akan bekerja untuk instalasi, dan program Anda mungkin berjalan dalam virtualenv di mana pythonpath Anda sepenuhnya pengguna-lokal, jadi seharusnya tidak menganggap penggunaan paket situs sistem secara langsung juga.
python2pada osx dan ubuntu dengan dan tanpa virtualenv tetapi tidak dengan python3sama sekali.
python3.
Cara stdlib modern menggunakan sysconfigmodul, tersedia dalam versi 2.7 dan 3.2+.
Catatan : sysconfig( sumber ) jangan disamakan dengan distutils.sysconfigsubmodule ( sumber ) yang disebutkan dalam beberapa jawaban lain di sini. Yang terakhir adalah modul yang sama sekali berbeda dan tidak memiliki get_pathsfungsi yang dibahas di bawah ini.
Python saat ini menggunakan delapan jalur ( dokumen ):
- stdlib : direktori yang berisi file library Python standar yang tidak spesifik platform.
- platstdlib : direktori yang berisi file library Python standar yang khusus untuk platform.
- platlib : direktori untuk file platform-spesifik situs, spesifik.
- purelib : direktori untuk file spesifik-situs, non-platform-spesifik.
- termasuk : direktori untuk file header non-platform-spesifik.
- platinclude : direktori untuk file header platform-spesifik.
- skrip : direktori untuk file skrip.
- data : direktori untuk file data.
Dalam kebanyakan kasus, pengguna yang menemukan pertanyaan ini akan tertarik pada jalur 'purelib' (dalam beberapa kasus , Anda mungkin tertarik pada 'platlib' juga). Tidak seperti jawaban yang diterima saat ini, metode ini masih berfungsi terlepas dari apakah Anda memiliki virtualenv diaktifkan atau tidak.
Di tingkat sistem (ini adalah Python 3.7.0 di 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'
Dengan venv, Anda akan mendapatkan sesuatu seperti ini
>>> import sysconfig
>>> sysconfig.get_paths()['purelib']
'/private/tmp/.venv/lib/python3.7/site-packages'
Script shell juga tersedia untuk menampilkan detail ini, yang dapat Anda gunakan dengan mengeksekusi sysconfigsebagai modul:
python -m sysconfig
platlib, seperti misalnya /usr/local/lib/python3.6/site-packages? Secara tradisional, hal-hal yang dipasang secara lokal harus masuk /usr/local.
Paket sistem asli yang diinstal dengan instalasi python di sistem berbasis Debian dapat ditemukan di:
/usr/lib/python2.7/dist-packages/
Di OSX - /Library/Python/2.7/site-packages
dengan menggunakan kode kecil ini:
from distutils.sysconfig import get_python_lib
print get_python_lib()
Namun, daftar paket yang diinstal melalui pipdapat ditemukan di:
/ usr / local / bin /
Atau kita bisa menulis perintah berikut untuk mendaftar semua jalur di mana paket python berada.
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
Catatan: lokasi mungkin bervariasi berdasarkan OS Anda, seperti di 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()dari instalasi sistem maka paket-dist, instalasi lain akan menampilkan paket-situs.
Semua jawaban (atau: jawaban yang sama berulang-ulang) tidak memadai. Yang ingin Anda lakukan adalah ini:
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
Baris terakhir berisi petunjuk instalasi. Bekerja di Ubuntu, sedangkan yang di atas tidak. Jangan tanya saya tentang windows atau dists lain, tetapi karena itu adalah dir yang sama persis yang menggunakan easy_install secara default, itu mungkin benar di mana-mana di mana easy_install bekerja (jadi, di mana-mana, bahkan mac). Selamat bersenang-senang. Catatan: kode asli memiliki banyak swearwords di dalamnya.
easy_installdan tidak gagal dengan anggun jika tidak tersedia yang tidak memadai :)
Catatan-samping: Solusi yang diusulkan ( distutils.sysconfig.get_python_lib()) tidak berfungsi ketika ada lebih dari satu direktori paket situs (seperti yang direkomendasikan oleh artikel ini ). Ini hanya akan mengembalikan direktori paket situs utama.
Sayangnya, saya juga tidak punya solusi. Python tampaknya tidak melacak direktori paket situs, hanya paket di dalamnya.
get_python_lib()ketika dijalankan dari dalam virtualenv menunjukkan paket situs dari Python yang digunakan untuk membuat virtualenv dan bukan paket situs virtualenv .
Ini bekerja untuk saya. Ini akan memberi Anda folder dist-paket dan paket situs. Jika folder tidak berada di jalur Python, itu tidak akan banyak membantu Anda.
import sys;
print [f for f in sys.path if f.endswith('packages')]
Output (instalasi Ubuntu):
['/home/username/.local/lib/python2.7/site-packages',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages']
Ini harus bekerja pada semua distribusi masuk dan keluar dari lingkungan virtual karena sifatnya "berteknologi rendah". Modul os selalu berada di direktori induk 'paket situs'
import os; print(os.path.dirname(os.__file__) + '/site-packages')
Untuk mengubah direktori ke direktori paket-situs saya menggunakan alias berikut (pada sistem * nix):
alias cdsp='cd $(python -c "import os; print(os.path.dirname(os.__file__))"); cd site-packages'
Catatan tambahan untuk get_python_libfungsi yang sudah disebutkan: pada beberapa platform direktori yang berbeda digunakan untuk modul platform tertentu (misalnya: modul yang membutuhkan kompilasi). Jika Anda beralih plat_specific=Trueke fungsi Anda mendapatkan paket situs untuk paket platform spesifik.
from distutils.sysconfig import get_python_lib
print get_python_lib()
pip show akan memberikan semua detail tentang sebuah paket: https://pip.pypa.io/en/stable/reference/pip_show/ [pip show] [1]
Untuk mendapatkan lokasi:
pip show <package_name>| grep Location
Jawab pertanyaan lama. Tetapi gunakan ipython untuk ini.
pip install ipython
ipython
import imaplib
imaplib?
Ini akan memberikan output berikut tentang paket 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
Aku harus melakukan sesuatu yang sedikit berbeda untuk sebuah proyek yang saya kerjakan: menemukan relatif situs-paket direktori relatif terhadap instalasi dasar awalan. Jika folder paket situs ada di /usr/lib/python2.7/site-packages, saya ingin /lib/python2.7/site-packagesbagian itu. Saya sebenarnya telah menemukan sistem di mana site-packagesberada /usr/lib64, dan jawaban yang diterima TIDAK bekerja pada sistem tersebut.
Mirip dengan jawaban penipu, solusi saya mengintip jauh ke dalam nyali Distutils, untuk menemukan jalan yang benar-benar dilewati di dalam setup.py. Sungguh menyakitkan untuk mengetahui bahwa saya tidak ingin ada orang yang harus memikirkan ini lagi.
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', ''))
Itu harus mencetak sesuatu seperti /Lib/site-packagesatau /lib/python3.6/site-packages.
pip show <package name>