Jawaban:
Ada dua jenis direktori paket situs, global dan per pengguna .
Direktori global paket-situs (" paket-dist ") terdaftar sys.path
ketika Anda menjalankan:
python -m site
Untuk daftar yang lebih ringkas jalankan getsitepackages
dari modul situs dalam kode Python:
python -c 'import site; print(site.getsitepackages())'
Catatan: Dengan virtualenvs, getitepackages tidak tersedia , sys.path
dari 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 --help
penjelasannya.
Petunjuk: Menjalankan pip list --user
atau pip freeze --user
memberi 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.py
Jalankan 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, pluggy
python -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-packages
bukan /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/local
melalui sudo pip
dan Anda tidak boleh menggunakan sudo pip
di 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 apt
atau sudo pip
kompatibel. Pertimbangkan masalah apa virtualenv
yang diciptakan untuk dipecahkan
dist-packages
in (L) Ubuntu.
Inilah yang bekerja untuk saya:
python -m site --user-site
~/.local/lib/python2.7/site-packages
).
virtualenv
mengeluh 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.bar
paket Anda :python -c "import foo.bar as _; print(_.__path__[0])"
Seperti yang telah dicatat orang lain, distutils.sysconfig
memiliki pengaturan yang relevan:
import distutils.sysconfig
print distutils.sysconfig.get_python_lib()
... meskipun defaultnya site.py
melakukan 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-python
dan menambahkan kedua jalur sys.exec_prefix
juga, jika konstanta berbeda).
Yang mengatakan, apa konteksnya? Anda tidak boleh main-main dengan Anda site-packages
secara 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.
python2
pada osx dan ubuntu dengan dan tanpa virtualenv tetapi tidak dengan python3
sama sekali.
python3
.
Cara stdlib modern menggunakan sysconfig
modul, tersedia dalam versi 2.7 dan 3.2+.
Catatan : sysconfig
( sumber ) jangan disamakan dengan distutils.sysconfig
submodule ( sumber ) yang disebutkan dalam beberapa jawaban lain di sini. Yang terakhir adalah modul yang sama sekali berbeda dan tidak memiliki get_paths
fungsi 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 sysconfig
sebagai 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 pip
dapat 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_install
dan 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_lib
fungsi yang sudah disebutkan: pada beberapa platform direktori yang berbeda digunakan untuk modul platform tertentu (misalnya: modul yang membutuhkan kompilasi). Jika Anda beralih plat_specific=True
ke 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-packages
bagian itu. Saya sebenarnya telah menemukan sistem di mana site-packages
berada /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-packages
atau /lib/python3.6/site-packages
.
pip show <package name>