Bagaimana cara menemukan lokasi direktori paket situs saya?
python
installation
Daryl Spitzer
sumber
sumber
pip show <package name>
Jawaban:
Ada dua jenis direktori paket situs, global dan per pengguna .
Direktori global paket-situs (" paket-dist ") terdaftar
sys.path
ketika Anda menjalankan:Untuk daftar yang lebih ringkas jalankan
getsitepackages
dari modul situs dalam kode Python: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:The per pengguna situs-paket direktori ( PEP 370 ) adalah di mana Python menginstal paket lokal Anda:
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
ataupip freeze --user
memberi Anda daftar semua paket per situs yang diinstal per pengguna .Kiat Praktis
<package>.__path__
memungkinkan Anda mengidentifikasi lokasi paket tertentu: ( detail )<module>.__file__
memungkinkan Anda mengidentifikasi lokasi modul tertentu: ( perbedaan )Jalankan
pip show <package>
untuk menampilkan informasi paket gaya-Debian:sumber
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])"
(atau hanya item pertama dengan
site.getsitepackages()[0]
)sumber
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:
Diformat agar mudah dibaca (daripada digunakan sebagai satu-liner), yang terlihat seperti berikut:
Sumber: dokumentasi "How to Install Django" versi sangat lama (meskipun ini berguna untuk lebih dari sekadar instalasi Django)
sumber
cdsitepackages
, untuk secara langsung berubah menjadi direktori paket situs lingkungan./usr/lib/python3/dist-packages
bukan/usr/lib/python3.5/dist-packages
.Untuk Ubuntu ,
...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.
sumber
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
melaluisudo pip
dan Anda tidak boleh menggunakansudo pip
di Ubuntu kecuali Anda memutuskan untuk membuat distribusi Anda sendiri: jika Anda menggunakansudo pip
, itu adalah tanggung jawab Anda untuk memastikan bahwa semua dependensi modul python saat ini dan masa depan diinstal melaluisudo apt
atausudo pip
kompatibel. Pertimbangkan masalah apavirtualenv
yang diciptakan untuk dipecahkandist-packages
in (L) Ubuntu.Inilah yang bekerja untuk saya:
sumber
~/.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 -
Anda dapat melakukan hal yang sama jika Anda menginstal lincah.
Ini untuk Snow Leopard. Tetapi saya pikir itu harus bekerja secara umum juga.
sumber
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:... meskipun defaultnya
site.py
melakukan sesuatu yang sedikit lebih kasar, diparafrasekan di bawah ini:(Ini juga menambah
${sys.prefix}/lib/site-python
dan menambahkan kedua jalursys.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.sumber
python2
pada osx dan ubuntu dengan dan tanpa virtualenv tetapi tidak denganpython3
sama sekali.python3
.Cara stdlib modern menggunakan
sysconfig
modul, tersedia dalam versi 2.7 dan 3.2+.Catatan :
sysconfig
( sumber ) jangan disamakan dengandistutils.sysconfig
submodule ( sumber ) yang disebutkan dalam beberapa jawaban lain di sini. Yang terakhir adalah modul yang sama sekali berbeda dan tidak memilikiget_paths
fungsi yang dibahas di bawah ini.Python saat ini menggunakan delapan jalur ( dokumen ):
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):
Dengan venv, Anda akan mendapatkan sesuatu seperti ini
Script shell juga tersedia untuk menampilkan detail ini, yang dapat Anda gunakan dengan mengeksekusi
sysconfig
sebagai modul:sumber
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:
Di OSX -
/Library/Python/2.7/site-packages
dengan menggunakan kode kecil ini:
Namun, daftar paket yang diinstal melalui
pip
dapat ditemukan di:Atau kita bisa menulis perintah berikut untuk mendaftar semua jalur di mana paket python berada.
Catatan: lokasi mungkin bervariasi berdasarkan OS Anda, seperti di OSX
sumber
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:
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.
sumber
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.
sumber
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.
Output (instalasi Ubuntu):
sumber
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'
Untuk mengubah direktori ke direktori paket-situs saya menggunakan alias berikut (pada sistem * nix):
sumber
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 beralihplat_specific=True
ke fungsi Anda mendapatkan paket situs untuk paket platform spesifik.sumber
sumber
pip show akan memberikan semua detail tentang sebuah paket: https://pip.pypa.io/en/stable/reference/pip_show/ [pip show] [1]
Untuk mendapatkan lokasi:
sumber
Jawab pertanyaan lama. Tetapi gunakan ipython untuk ini.
Ini akan memberikan output berikut tentang paket imaplib -
sumber
Anda harus mencoba perintah ini untuk menentukan lokasi pemasangan pip
Python 2
Python 3
sumber
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 manasite-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.Itu harus mencetak sesuatu seperti
/Lib/site-packages
atau/lib/python3.6/site-packages
.sumber
Jika sudah ditambahkan ke
PYTHONPATH
Anda juga dapat melakukan sesuatu sepertisumber