Temukan semua paket yang diinstal dengan easy_install / pip?

400

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

Jürgen A. Erhard
sumber

Jawaban:

381

pip freezeakan 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

TheodorosPloumis
sumber
89
Pada Versi 1.3 'daftar pipa' telah ditambahkan. Lihat jawaban saya di bawah dan dokumen di sini: pip-installer.org/en/latest/usage.html#pip-list
keybits
7
daftar dan bekukan output format yang berbeda (pada saat penulisan). Output pembekuan dapat digunakan untuk membuat ulang lingkungan: docs.python-guide.org/en/latest/dev/virtualenvs/#other-notes
Tom Saleeba
18
pip freezedan pip listdaftar semuanya. Mereka tidak mengecualikan paket yang tidak diinstal oleh pip.
Eliad
Saya juga menemukan pip freezedapat diandalkan dalam skrip, sedangkan pip listakan menghasilkan kesalahan yang tidak terduga ketika digunakan dengan pipa.
Dale Anderson
2
Yang baru (?) pip list -lAtau pip list --localmerupakan jawaban terbaik, lihat stackoverflow.com/a/43012269/491884 oleh @MJB
jmuc
255

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/

kunci tombol
sumber
3
Di Gentoo, ini mencantumkan semua paket, bahkan yang diinstal dengan cara lain selain pip. Apakah ini benar-benar mengecualikan modul yang diinstal non-pip pada sistem lain seperti yang diminta oleh pertanyaan?
jlh
Perhatikan bahwa ini sedikit berbeda daripip freeze
sg.
1
pip list --userhanya menunjukkan paket yang diinstal oleh pengguna, dan tidak termasuk paket di seluruh sistem.
Jacob Hume
138

Jika ada yang bertanya-tanya Anda dapat menggunakan perintah 'pip show'.

pip show [options] <package>

Ini akan mendaftar direktori instal dari paket yang diberikan.

Daniel Sikes
sumber
24

Jika Debian berperilaku seperti versi Ubuntu baru-baru ini mengenai pip installtarget default, itu mudah: ia menginstal ke /usr/local/lib/bukan /usr/lib( apttarget 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 -Qoadalah bagaimana Arch pac kage pria ager memeriksa kepemilikan file. No packageadalah bagian dari pengembalian memberikan ketika ada paket memiliki file: error: No package owns $FILENAME. Solusi rumit: Saya menanyakan tentang __init__.pykarena pacman -Qosedikit bodoh ketika datang ke direktori :(

Untuk melakukannya untuk distro lain, Anda harus mencari tahu di mana pipmenginstal barang (hanya sudo pip installsesuatu), 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 -Sakan 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'
Capi Etheriel
sumber
2
+1 Terima kasih banyak untuk Arch one-liner, itulah yang saya cari. Ngomong-ngomong, fakta yang aneh: instalasi Arch saya dilokalkan dalam bahasa Italia, tetapi grep benar 'menangkap' baris yang mengatakan 'Nessun pacchetto' (bahasa Italia untuk 'Tidak ada paket') meskipun saya memilih 'Tidak ada paket'. Bagaimana bisa?
Nadir Sampaoli
1
@barraponto @NadirSampaoli grep tidak melakukan apa pun dalam kasus saya. Karena grep coba grep di stdout, tetapi dpkgtulis kesalahannya ke stderr jadi saya harus menambahkan arahan ulang 2>&1. Dan untuk output internasional tambahkan LANG= di depan xargs dpkg -s. dan sedjuga 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/"
David Boho
1
hai, saya menurunkan ini karena kesalahan dan baru saja menyadarinya, dan sekarang suara saya terkunci. Bisakah seseorang memilih ini untuk menetralisir downvote saya? Terima kasih
Jonathan
22

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    
ng10
sumber
IMHO jawaban terbaik. Sangat sederhana dan cepat jika saya tahu nama paketnya. daftar pip bahkan tidak diperlukan dan membeku bisa memakan waktu lama dan saya harus menyaring hal-hal yang saya tidak pedulikan. Sederhana: pip show my_packge
ChuckZ
8

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
yegle
sumber
2
Ini tidak akan berfungsi lagi. Lihat github.com/pypa/pip/issues/5243 Sebagai gantinya Anda harus menggunakan: import pkg_resources [print (d.project_name) untuk d di pkg_resources.working_set]
Almenon
6

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 listmenyediakan 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)
$
MarkHu
sumber
Mengapa tidak mengajukan sendiri tiketnya?
lajarre
1
Rupanya versi berikutnya dari pip akan memiliki perintah daftar baru: pip-installer.org/en/latest/usage.html#pip-list
MarkHu
5

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.

Semuanya
sumber
5

Versi pip yang lebih baru memiliki kemampuan untuk melakukan apa yang OP inginkan melalui pip list -latau 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.

MJB
sumber
1
ternyata kami punya pip freeze --localselama 8 tahun. pip list --localtersedia juga ... tetapi perhatikan pertanyaan OP bukan tentang lingkungan virtual (yang --localmendukung) tetapi tentang membedakan paket distro dari sudo pip installpaket.
Capi Etheriel
4

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 listmengembalikan kesalahan The program 'pip' is currently not installed. You can install it by typing: sudo apt-get install python-pip.

ntk4
sumber
pip untuk python2.7, pip3 untuk python3.x
mjp
3

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

mscheker
sumber
2

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:'
eddygeek
sumber
1

Masukkan semua nama file / folder site-packages/(dan dist-packages/jika ada), dan gunakan manajer paket Anda untuk menghapus yang diinstal melalui paket.

Ignacio Vazquez-Abrams
sumber
1

freeze pip mencantumkan semua paket yang diinstal meskipun tidak dengan pip / easy_install. Pada CentOs / Redhat ditemukan paket yang diinstal melalui rpm.

pengguna3013438
sumber
1

Jika Anda menggunakan distribusi python Anaconda , Anda dapat menggunakan conda listperintah 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 pipsendiri):

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 pipjika 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 -ybendera untuk pip uninstallmenghindari harus memberikan konfirmasi untuk menghapus.

CS
sumber
1

Bagi yang belum menginstal pip, saya menemukan skrip cepat ini di github (berfungsi dengan Python 2.7.13):

import pkg_resources
distros = pkg_resources.AvailableDistributions()
for key in distros:
  print distros[key]
Ed K
sumber
0

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
penekanan tombol
sumber