Bagaimana cara menemukan lokasi direktori paket-situs Python saya?

943

Bagaimana cara menemukan lokasi direktori paket situs saya?

Daryl Spitzer
sumber
63
Jika Anda hanya ingin lokasi yang tepat dari satu paket maka Anda dapat menggunakanpip show <package name>
joshuakcockrell

Jawaban:

533

Ada dua jenis direktori paket situs, global dan per pengguna .

  1. 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"])'
  2. 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 .


Kiat Praktis

  • <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
Peterino
sumber
17
ada direktori paket situs dalam virtualenv. Anda bisa mendapatkan direktori untuk modul khusus situs di dalam / di luar virtualenv menggunakan python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"(ini juga berfungsi pada Python 2 dan 3).
jfs
4
Bagus. Dan untuk mendapatkan yang pertama:python -c "import site; print(site.getsitepackages()[0])"
Brent Faust
2
Ini harus dalam tutorial dasar tentang penggunaan python. Saya telah pythoning selama bertahun-tahun dan tidak tahu tentang modul situs. Akan menyelamatkan begitu banyak sakit kepala ...
salotz
1
Saya telah menyarankan perubahan pada tutorial resmi Python. Silakan lihat PR # 16974 untuk detailnya, dan terima kasih atas sarannya @salotz!
Peterino
1
Saya pikir stackoverflow.com/a/52638888/1365918 dengan mudah adalah jawaban terbaik untuk pertanyaan ini.
kapad
652
>>> 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])

eudoxos
sumber
17
Ini bagus tapi, sayangnya, fungsi ini hanya tersedia dari python2.7. Jadi, solusi yang bagus jika Anda menggunakan python2.7 atau lebih tinggi, tetapi tidak berfungsi untuk python 2.6 dan di bawahnya
Dan Niero
15
python -c "situs impor; cetak (site.getsitepackages ())"
Lars Schneider
29
Saya mendapatkan AttributeError: objek 'modul' tidak memiliki atribut 'getitepackages' saat menggunakan dengan virtualenv (python 2.7.8), namun solusi distutils di bawah ini berfungsi.
radtek
8
@radtek: untuk venv's, saya mendeteksi venv via 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].
eudoxos
4
@radtek Adalah bug yang diketahui bahwa modul situs tidak berfungsi untuk virtualenv github.com/pypa/virtualenv/issues/355
Guillem Cucurull
319

Solusi yang:

  • di luar virtualenv - menyediakan jalur global paket situs ,
  • Insidue a virtualenv - menyediakan paket-situs situs virtualenv

... 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)

Daryl Spitzer
sumber
1
Apakah virtualenv menyediakan cara untuk menemukan paket situsnya?
Daryl Spitzer
10
Anda dapat menggunakan virtualenvwrapper, yang memiliki perintah cdsitepackages, untuk secara langsung berubah menjadi direktori paket situs lingkungan.
john2x
6
@PiotrDobrogost: bekerja untuk saya di Python 2.7 di virtualenv di Linux
RichVel
2
Komentar pertama tidak berlaku lagi: ini menunjukkan lokasi yang benar baik di luar maupun di dalam virtualenv.
astrojuanlu
2
Tidak berfungsi untuk saya di Windows 10 menggunakan Linux bash, ia mengembalikannya /usr/lib/python3/dist-packagesbukan /usr/lib/python3.5/dist-packages.
Delgan
99

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.

David Hollander
sumber
3
Jika penanya mencari lokasi paket tertentu, module.__file__adalah cara yang lebih baik. Jika mereka mencoba menginstal sesuatu ... cukup gunakan alat.
Tobu
'/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
jfs
Penjelasan yang jelas untuk memahami perbedaan 2 dist-packagesin (L) Ubuntu.
Timo
69

Inilah yang bekerja untuk saya:

python -m site --user-site
Ramashri
sumber
15
Bagi saya ini menunjuk ke folder yang bahkan tidak ada ( ~/.local/lib/python2.7/site-packages).
Neil Traft
1
sama, di OS X Mavericks, rumah saya. Lokal bukan yang saya inginkan dan ditambah ya itu tidak benar-benar ada.
radtek
Ada di folder utama / Library saya, saya harus secara manual menavigasi ke sana, untuk beberapa alasan jalur penuh langsung tidak berfungsi
efwjames
bagaimana cara menggunakan paket yang diinstal di sini? jika saya melakukannya virtualenvmengeluh bahwa paket tersebut tidak ada. bagaimana cara mengaktifkan paket yang diinstal di lokasi khusus?
AbtPst
2
Ini memberi tahu Anda di mana Python akan mencari paket spesifik pengguna. Komentar seperti "bahkan tidak ada" dan "bukan yang saya inginkan" tidak masuk akal dalam konteks ini.
Jujur Abe
28

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.

Sumod
sumber
>>> import pg >>> print pg .__ path__ Traceback (panggilan terakhir terakhir): File "<stdin>", baris 1, dalam <module> AttributeError: objek 'module' tidak memiliki atribut ' path '
Dannid
berfungsi, saya perlu menemukan paket sklearn untuk ditambahkan ke jalur PYDEV, terima kasih.
berkay
gunakan 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).
JL Peyret
Berdasarkan ini dan jawaban lain Anda dapat melakukan ini dalam satu baris dari baris perintah untuk mendapatkan path ke foo.barpaket Anda :python -c "import foo.bar as _; print(_.__path__[0])"
snark
23

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.

Charles Duffy
sumber
3
berfungsi dengan baik python2pada osx dan ubuntu dengan dan tanpa virtualenv tetapi tidak dengan python3sama sekali.
Jitter
2
2008 adalah waktu yang lalu - jawaban ini adalah tiga bulan sebelum rilis Python 3.0.
Charles Duffy
tentu, tapi hari ini komentar saya mungkin membantu. koreksi saya jika saya salah. lebih jauh lagi, saya tidak downvote jawaban ini atau yang lainnya sehubungan dengan python3.
Jitter
22

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
wim
sumber
Ini adalah jawaban yang bagus, saya senang modul sysconfig baru membuatnya lebih mudah. Apakah ada cara untuk mendapatkan awalan lokal platlib, seperti misalnya /usr/local/lib/python3.6/site-packages? Secara tradisional, hal-hal yang dipasang secara lokal harus masuk /usr/local.
eudoxos
Mudah jawaban terbaik untuk pertanyaan ini! Terima kasih. Satu-satunya hal yang saya temukan hilang adalah pemesanan di mana lokasi-lokasi ini diperiksa ketika pernyataan impor ditemui. Juga, apakah ada dari lokasi-lokasi ini yang ditelusuri / di-cache ketika python dimuat? Mengetahui hal itu juga akan bermanfaat bagi IMO.
kapad
21

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']
fnatic_shank
sumber
Jika saya ingat dengan benar, dist-paket khusus untuk Debian dan turunannya.
Samuel
1
@SamuelSantana Anda benar. paket-dist khusus untuk sistem berbasis debian. Dalam hal ini saya dipanggil site.getsitepackages()dari instalasi sistem maka paket-dist, instalasi lain akan menampilkan paket-situs.
fnatic_shank
15

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.

penipu
sumber
1
Terima kasih, ini cukup berguna, pada py3 dengan tanda kurung untuk mencetak itu membuat saya / usr / local / lib /python3.4/dist-paket Saya mencoba mencari cara untuk mendapatkan / usr / lib /python3.4/dist -Paket jadi harus bermain lebih jauh.
Stuart Axon
4
memerlukan perpustakaan eksternal easy_installdan tidak gagal dengan anggun jika tidak tersedia yang tidak memadai :)
jitter
1
memang, ini tidak sempurna, tetapi berhasil untuk saya dan membutuhkan banyak waktu untuk mencari tahu, jadi saya taruh di sini dengan harapan orang lain dapat membangun berdasarkan waktu yang telah saya habiskan untuk itu.
penipu
13

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.

Vladimir Vagaytsev
sumber
1
Saya kira itulah alasan mengapa get_python_lib()ketika dijalankan dari dalam virtualenv menunjukkan paket situs dari Python yang digunakan untuk membuat virtualenv dan bukan paket situs virtualenv .
Piotr Dobrogost
3
@Piotr Itu mungkin bug di distutils.sysconfig. Saya baru saja mengujinya dan saya mendapatkan paket-paket situs dalam, seperti yang diharapkan.
Tobu
Juga diuji dengan Python 2.7 yang diinstal dalam virtualenv di Linux, dan metode distutils.sysconfig berfungsi dengan baik untuk mendapatkan paket-paket situs Python.
RichVel
12

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']
just_an_old_guy
sumber
2
jawaban yang diterima adalah cara yang disarankan, jadi Anda harus tahu mengapa milik Anda lebih baik, karena ini sedikit meretas
CharlesB
Apa yang salah dengan peretasan? ;) Lebih sederhana dan mudah dipahami dan diingat jika Anda bekerja secara interaktif.
just_an_old_guy
11

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'
Pemula Piramida
sumber
10

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.

Armin Ronacher
sumber
8
from distutils.sysconfig import get_python_lib
print get_python_lib()
Florian Bösch
sumber
3

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
Sahil Agarwal
sumber
1
Ini bukan direktori paket situs, tetapi direktori tempat paket diinstal. Ini juga hanya membantu jika Anda menggunakan iPython dan bukan karena secara program bisa mendapatkan direktori instal.
danielunderwood
3

Anda harus mencoba perintah ini untuk menentukan lokasi pemasangan pip

Python 2

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

Python 3

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

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.

Multi-Ekonomi
sumber
-2

Jika sudah ditambahkan ke PYTHONPATHAnda juga dapat melakukan sesuatu seperti

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