Apakah ada cara untuk menemukan semua paket Python PyPI yang diinstal dengan easy_install atau pip? Maksud saya, tidak termasuk semua yang diinstal dengan alat distribusi (dalam hal ini apt-get on Debian).
Apakah ada cara untuk menemukan semua paket Python PyPI yang diinstal dengan easy_install atau pip? Maksud saya, tidak termasuk semua yang diinstal dengan alat distribusi (dalam hal ini apt-get on Debian).
Jawaban:
pip freeze
akan menampilkan daftar paket yang diinstal dan versinya. Ini juga memungkinkan Anda untuk menulis paket-paket itu ke file yang nantinya dapat digunakan untuk mengatur lingkungan baru.
https://pip.pypa.io/en/stable/reference/pip_freeze/#pip-freeze
pip freeze
dan pip list
daftar semuanya. Mereka tidak mengecualikan paket yang tidak diinstal oleh pip
.
pip freeze
dapat diandalkan dalam skrip, sedangkan pip list
akan menghasilkan kesalahan yang tidak terduga ketika digunakan dengan pipa.
pip list -l
Atau pip list --local
merupakan jawaban terbaik, lihat stackoverflow.com/a/43012269/491884 oleh @MJB
Pada versi 1.3 dari pip sekarang Anda dapat menggunakan pip list
Ini memiliki beberapa opsi yang berguna termasuk kemampuan untuk menunjukkan paket yang sudah ketinggalan zaman. Berikut dokumentasinya: https://pip.pypa.io/en/latest/reference/pip_list/
pip freeze
pip list --user
hanya menunjukkan paket yang diinstal oleh pengguna, dan tidak termasuk paket di seluruh sistem.
Jika ada yang bertanya-tanya Anda dapat menggunakan perintah 'pip show'.
pip show [options] <package>
Ini akan mendaftar direktori instal dari paket yang diberikan.
Jika Debian berperilaku seperti versi Ubuntu baru-baru ini mengenai pip install
target default, itu mudah: ia menginstal ke /usr/local/lib/
bukan /usr/lib
( apt
target default). Periksa /ubuntu/173323/how-do-i-detect-and-remove-python-packages-installed-via-pip/259747#259747
Saya adalah pengguna ArchLinux dan ketika saya bereksperimen dengan pip saya menemukan masalah yang sama. Inilah cara saya menyelesaikannya di Arch.
find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs pacman -Qo | grep 'No package'
Kuncinya di sini adalah /usr/lib/python2.7/site-packages
, yang merupakan instalasi direktori pip ke, YMMV. pacman -Qo
adalah bagaimana Arch pac kage pria ager memeriksa kepemilikan file. No package
adalah bagian dari pengembalian memberikan ketika ada paket memiliki file: error: No package owns $FILENAME
. Solusi rumit: Saya menanyakan tentang __init__.py
karena pacman -Qo
sedikit bodoh ketika datang ke direktori :(
Untuk melakukannya untuk distro lain, Anda harus mencari tahu di mana pip
menginstal barang (hanya sudo pip install
sesuatu), bagaimana cara meminta kepemilikan file (metode Debian / Ubuntu dpkg -S
) dan apa yang dimaksud dengan "tidak ada paket yang memiliki jalur itu" kembali (Debian / Ubuntu adalah no path found matching pattern
). Pengguna Debian / Ubuntu, berhati-hatilah: dpkg -S
akan gagal jika Anda memberikannya tautan simbolik. Cukup atasi dulu dengan menggunakan realpath
. Seperti ini:
find /usr/local/lib/python2.7/dist-packages -maxdepth 2 -name __init__.py | xargs realpath | xargs dpkg -S 2>&1 | grep 'no path found'
Pengguna Fedora dapat mencoba (terima kasih @eddygeek):
find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'
dpkg
tulis kesalahannya ke stderr jadi saya harus menambahkan arahan ulang 2>&1
. Dan untuk output internasional tambahkan LANG=
di depan xargs dpkg -s
. dan sed
juga merupakan alat yang bagus;) untuk menyimpan hanya nama paket path. Jadi saya berakhir dengan:find /usr/local/lib/python2.7/dist-packages -maxdepth 2 -name __init__.py | xargs realpath | LANG= xargs dpkg -S 2>&1 | grep 'no path found' | sed "s/.*\/\([^\/]*\)\/__init__\.py.*/\1/"
Dimulai dari:
$ pip list
Untuk membuat daftar semua paket. Setelah Anda menemukan paket yang Anda inginkan, gunakan:
$ pip show <package-name>
Ini akan menunjukkan kepada Anda detail tentang paket ini, termasuk foldernya. Anda dapat melewati bagian pertama jika Anda sudah tahu nama paketnya
Klik di sini untuk informasi lebih lanjut tentang pip show dan di sini untuk informasi lebih lanjut tentang daftar pip.
Contoh:
$ pip show jupyter
Name: jupyter
Version: 1.0.0
Summary: Jupyter metapackage. Install all the Jupyter components in one go.
Home-page: http://jupyter.org
Author: Jupyter Development Team
Author-email: jupyter@googlegroups.org
License: BSD
Location: /usr/local/lib/python2.7/site-packages
Requires: ipywidgets, nbconvert, notebook, jupyter-console, qtconsole, ipykernel
pip.get_installed_distributions()
akan memberikan daftar paket yang diinstal
import pip
from os.path import join
for package in pip.get_installed_distributions():
print(package.location) # you can exclude packages that's in /usr/XXX
print(join(package.location, package._get_metadata("top_level.txt"))) # root directory of this package
Di bawah ini agak lambat, tetapi memberikan daftar paket yang diformat dengan baik pip
. Dengan kata lain, tidak semuanya diinstal "oleh" pip, tetapi semuanya harus dapat ditingkatkan dengan pip.
$ pip search . | egrep -B1 'INSTALLED|LATEST'
Alasannya lambat adalah karena daftar isi dari seluruh repo pypi. Saya mengajukan tiket yang menyarankan untuk pip list
menyediakan fungsi serupa tetapi lebih efisien.
Output sampel: (membatasi pencarian ke subset alih-alih '.' Untuk semua.)
$ pip search selenium | egrep -B1 'INSTALLED|LATEST'
selenium - Python bindings for Selenium
INSTALLED: 2.24.0
LATEST: 2.25.0
--
robotframework-selenium2library - Web testing library for Robot Framework
INSTALLED: 1.0.1 (latest)
$
Menambahkan ke jawaban @Paul Woolcock,
pip freeze > requirements.txt
akan membuat file persyaratan dengan semua paket yang diinstal bersama dengan nomor versi yang diinstal di lingkungan aktif di lokasi saat ini. Lari
pip install -r requirements.txt
akan menginstal paket yang ditentukan dalam file persyaratan.
Versi pip yang lebih baru memiliki kemampuan untuk melakukan apa yang OP inginkan melalui pip list -l
atau pip freeze -l
( --list
).
Pada Debian (setidaknya) halaman manual tidak memperjelas ini, dan saya hanya menemukannya - dengan asumsi bahwa fitur tersebut harus ada - dengan pip list --help
.
Ada komentar baru-baru ini yang menyarankan fitur ini tidak jelas dalam dokumentasi atau jawaban yang ada (walaupun diisyaratkan oleh beberapa orang), jadi saya pikir saya harus memposting. Saya lebih suka melakukannya sebagai komentar, tetapi saya tidak memiliki poin reputasi.
pip freeze --local
selama 8 tahun. pip list --local
tersedia juga ... tetapi perhatikan pertanyaan OP bukan tentang lingkungan virtual (yang --local
mendukung) tetapi tentang membedakan paket distro dari sudo pip install
paket.
Perhatikan bahwa jika Anda memiliki beberapa versi Python yang diinstal pada komputer Anda, Anda mungkin memiliki beberapa versi pip yang terkait dengannya.
Bergantung pada asosiasi Anda, Anda mungkin harus sangat berhati-hati dengan perintah pip apa yang Anda gunakan:
pip3 list
Bekerja untuk saya, di mana saya menjalankan Python3.4. Cukup gunakan pip list
mengembalikan kesalahan The program 'pip' is currently not installed. You can install it by typing: sudo apt-get install python-pip
.
Seperti yang ditunjukkan @almenon, ini tidak lagi berfungsi dan ini bukan cara yang didukung untuk mendapatkan informasi paket dalam kode Anda. Berikut ini memunculkan pengecualian:
import pip
installed_packages = dict([(package.project_name, package.version)
for package in pip.get_installed_distributions()])
Untuk mencapai ini, Anda dapat mengimpor pkg_resources
. Ini sebuah contoh:
import pkg_resources
installed_packages = dict([(package.project_name, package.version)
for package in pkg_resources.working_set])
aku di v3.6.5
Berikut ini adalah satu-liner untuk fedora atau distro rpm lainnya (berdasarkan tips @barraponto):
find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'
Tambahkan ini ke perintah sebelumnya untuk mendapatkan hasil yang lebih bersih:
| sed -r 's:.*/(\w+)/__.*:\1:'
Masukkan semua nama file / folder site-packages/
(dan dist-packages/
jika ada), dan gunakan manajer paket Anda untuk menghapus yang diinstal melalui paket.
freeze pip mencantumkan semua paket yang diinstal meskipun tidak dengan pip / easy_install. Pada CentOs / Redhat ditemukan paket yang diinstal melalui rpm.
Jika Anda menggunakan distribusi python Anaconda , Anda dapat menggunakan conda list
perintah untuk melihat apa yang diinstal dengan metode apa:
user@pc:~ $ conda list
# packages in environment at /anaconda3:
#
# Name Version Build Channel
_ipyw_jlab_nb_ext_conf 0.1.0 py36h2fc01ae_0
alabaster 0.7.10 py36h174008c_0
amqp 2.2.2 <pip>
anaconda 5.1.0 py36_2
anaconda-client 1.6.9 py36_0
Untuk mengambil entri yang diinstal oleh pip
(termasuk kemungkinan pip
sendiri):
user@pc:~ $ conda list | grep \<pip
amqp 2.2.2 <pip>
astroid 1.6.2 <pip>
billiard 3.5.0.3 <pip>
blinker 1.4 <pip>
ez-setup 0.9 <pip>
feedgenerator 1.9 <pip>
Tentu saja Anda mungkin ingin memilih kolom pertama, yang dapat Anda lakukan dengan (tidak termasuk pip
jika diperlukan):
user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}'
amqp
astroid
billiard
blinker
ez-setup
feedgenerator
Akhirnya Anda dapat mengambil nilai-nilai ini dan mem-uninstall semua dari mereka menggunakan yang berikut ini:
user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}' | xargs pip uninstall -y
Perhatikan penggunaan -y
bendera untuk pip uninstall
menghindari harus memberikan konfirmasi untuk menghapus.
daftar pip [opsi] Anda dapat melihat referensi lengkap di sini
Setidaknya untuk Ubuntu (mungkin juga yang lain) berfungsi seperti ini (terinspirasi oleh posting sebelumnya di utas ini):
printf "Installed with pip:";
pip list 2>/dev/null | gawk '{print $1;}' | while read; do pip show "${REPLY}" 2>/dev/null | grep 'Location: /usr/local/lib/python2.7/dist-packages' >/dev/null; if (( $? == 0 )); then printf " ${REPLY}"; fi; done; echo