Bagaimana cara mendaftar semua paket yang diinstal dan versinya dalam Python?


128

Apakah ada cara di Python untuk mendaftar semua paket yang diinstal dan versinya?

Saya tahu saya bisa masuk ke dalam python/Lib/site-packagesdan melihat file dan direktori apa yang ada, tetapi saya merasa ini sangat canggung. Apa yang saya cari adalah sesuatu yang mirip npm listyaitu npm-ls .


Jawaban:


196

Jika Anda memiliki instalasi pip dan Anda ingin melihat paket apa yang telah diinstal dengan alat pemasang Anda, Anda dapat menyebutnya:

pip freeze

Ini juga akan menyertakan nomor versi untuk paket yang diinstal.

Memperbarui

pip telah diperbarui untuk juga menghasilkan keluaran yang sama pip freezedengan menelepon:

pip list

Catatan

Output dari pip listdiformat secara berbeda, jadi jika Anda memiliki beberapa skrip shell yang mem-parsing output (mungkin untuk mengambil nomor versi) freezedan ingin mengubah skrip Anda untuk dipanggil list, Anda harus mengubah kode parsing Anda.


9
IMHO mereka harus menyediakan pip listsebagai alias untuk pip freeze. Ini intuitif untuk menulis pip freeze > requirements.txt, tetapi tidak pip freeze.
jsalonen

3
WOW: Baru saja melihat dokumentasi versi terbaru dari pip dan sepertinya mereka telah menambahkan pip list: pip-installer.org/en/latest/usage.html#pip-list - jadi ini sebenarnya adalah sesuatu yang sudah datang!
jsalonen

51

help('modules') harus melakukannya untukmu.

dalam IPython:

In [1]: import                      #import press-TAB
Display all 631 possibilities? (y or n)
ANSI                   audiodev               markupbase
AptUrl                 audioop                markupsafe
ArgImagePlugin         avahi                  marshal
BaseHTTPServer         axi                    math
Bastion                base64                 md5
BdfFontFile            bdb                    mhlib
BmpImagePlugin         binascii               mimetools
BufrStubImagePlugin    binhex                 mimetypes
CDDB                   bisect                 mimify
CDROM                  bonobo                 mmap
CGIHTTPServer          brlapi                 mmkeys
Canvas                 bsddb                  modulefinder
CommandNotFound        butterfly              multifile
ConfigParser           bz2                    multiprocessing
ContainerIO            cPickle                musicbrainz2
Cookie                 cProfile               mutagen
Crypto                 cStringIO              mutex
CurImagePlugin         cairo                  mx
DLFCN                  calendar               netrc
DcxImagePlugin         cdrom                  new
Dialog                 cgi                    nis
DiscID                 cgitb                  nntplib
DistUpgrade            checkbox               ntpath

5
Itu berguna! Saya ingin melihat versi juga.
jsalonen

4
Saya pikir masalahnya adalah tidak ada cara standar untuk memasukkan versi ... kadang-kadang Package.version()atau package.__version__atau package.veratau sejumlah kemungkinan lainnya
Joran Beasley

Saya pikir moto python adalah "hanya ada satu cara untuk melakukannya";)?
Ed Randall

3
@ EdRandall, tidak - itu "satu cara yang jelas untuk melakukannya". Selalu ada cara yang tidak terlihat. Juga, kata-kata yang tepat adalah: Harus ada satu - dan lebih disukai hanya satu - cara yang jelas untuk melakukannya. Meskipun demikian mungkin tidak jelas pada awalnya kecuali Anda orang Belanda.
rosuav

30

Jika Anda ingin mendapatkan informasi tentang distribusi python yang diinstal dan tidak ingin menggunakan cmd console atau terminal Anda untuk itu, melainkan melalui kode python, Anda dapat menggunakan kode berikut (diuji dengan python 3.4):

import pip #needed to use the pip functions
for i in pip.get_installed_distributions(local_only=True):
    print(i)

The pip.get_installed_distributions(local_only=True)fungsi panggilan mengembalikan sebuah iterable dan karena untuk loop dan fungsi cetak unsur-unsur yang terkandung dalam iterable yang dicetak dipisahkan oleh karakter baris baru ( \n). Hasilnya akan (tergantung pada distribusi yang Anda instal) akan terlihat seperti ini:

cycler 0.9.0
decorator 4.0.4
ipykernel 4.1.0
ipython 4.0.0
ipython-genutils 0.1.0
ipywidgets 4.0.3
Jinja2 2.8
jsonschema 2.5.1
jupyter 1.0.0
jupyter-client 4.1.1
#... and so on...

4
Untuk memperluas komentar @ exhuma, dengan pip 10 Anda harus menggunakan: import pkg_resources [print (d.project_name) untuk d di pkg_resources.working_set]
Almenon

Bagaimana keadaannya pkg_resources? AFAICR ini bagian dari setuptools. Tidak pip. Bisakah kita dengan aman berasumsi bahwa setuptoolsakan selalu tersedia hanya bergantung pada pip?
exhuma

9

Anda dapat mencoba: Kuning telur

Untuk memasang kuning telur, coba:

easy_install yolk

Yolk adalah alat Python untuk mendapatkan informasi tentang paket Python yang terinstal dan paket kueri yang tersedia di PyPI (Indeks Paket Python).

Anda dapat melihat paket mana yang aktif, tidak aktif atau dalam mode pengembangan dan menunjukkan kepada Anda yang memiliki versi lebih baru dengan meminta PyPI.


Saya biasanya menggunakan pip untuk tugas ini pada saat ini, tetapi saya memiliki proyek yang sangat lama yang belum siap saya tambahkan distribusinya, dan saya ingat ada alat seperti ini di luar sana. Tidak ingat apa namanya ... Ini dia!
meshantz

1
Itu tidak mendukung python 3 (hanya diinstal dari pip dan mendapat kesalahan runtime)
Ohad Cohen

9

Untuk menjalankan ini di versi pip yang lebih baru (diuji pada pip==10.0.1) gunakan yang berikut ini:

from pip._internal.operations.freeze import freeze
for requirement in freeze(local_only=True):
    print(requirement)

Apa status internal? Saya melihat pydoc pip._internaltetapi saya tidak dapat mencapainya di bawah help(pip._internal), pip .__ builtins_ dll. Panduan referensi pip juga kosong.
MortenB

1
Sayangnya saya tidak tahu. Saya juga tidak suka dipanggil _internal. Sepertinya fungsionalitasnya tidak terekspos secara resmi. Jadi, Anda harus menangani ini dengan hati-hati!
exhuma

8

dari baris perintah

python -c help('modules')

dapat digunakan untuk melihat semua modul, dan untuk modul tertentu

python -c help('os')

Untuk Linux di bawah ini akan berfungsi

python -c "help('os')"

5
Ini berfungsi di windows. Di linux ia melempar kesalahan:-bash: syntax error near unexpected token `('
AjayKumarBasuthkar

ini tidak memberikan versi modul
Stepan Yakovenko

5

Iya! Anda harus menggunakan pip sebagai manajer paket python Anda ( http://pypi.python.org/pypi/pip )

dengan paket yang terinstal, Anda dapat melakukan

pip freeze

dan itu akan mencantumkan semua paket yang diinstal. Anda mungkin juga harus menggunakan virtualenv dan virtualenvwrapper . Ketika Anda memulai proyek baru, Anda bisa melakukannya

mkvirtualenv my_new_project

dan kemudian (di dalam virtualenv itu), lakukan

pip install all_your_stuff

Dengan cara ini, Anda dapat workon my_new_projectdan kemudian pip freezeuntuk melihat paket mana yang diinstal untuk proyek virtualenv itu.

sebagai contoh:

  ~  mkvirtualenv yo_dude
New python executable in yo_dude/bin/python
Installing setuptools............done.
Installing pip...............done.
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/predeactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/postdeactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/preactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/postactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/get_env_details

(yo_dude)➜  ~  pip install django
Downloading/unpacking django
  Downloading Django-1.4.1.tar.gz (7.7Mb): 7.7Mb downloaded
  Running setup.py egg_info for package django

Installing collected packages: django
  Running setup.py install for django
    changing mode of build/scripts-2.7/django-admin.py from 644 to 755

    changing mode of /Users/aaylward/dev/virtualenvs/yo_dude/bin/django-admin.py to 755
Successfully installed django
Cleaning up...

(yo_dude)➜  ~  pip freeze
Django==1.4.1
wsgiref==0.1.2

(yo_dude)➜  ~  

atau jika Anda memiliki paket python dengan file requirement.pip,

mkvirtualenv my_awesome_project
pip install -r requirements.pip
pip freeze

akan melakukan trik


Oh ya saya sudah menggunakan virtualenv sebenarnya untuk beberapa waktu. Saya hanya tidak tahu bagaimana saya tidak tahu saya bisa menggunakannya pipbersamaan dengan ini!
jsalonen

Tentang virtualenvdengan paket situs global, Anda harus menggunakannya pip list --local.
Ioannis Filippidis

@johntex Anda tidak boleh menggunakan paket situs global!
Andbdrew

Menggunakan paket situs global sangat berguna. Jika tidak, opsi tidak akan ada sama sekali virtualenv. Saya tidak mengetahui alasan untuk tidak menggunakannya, dan tidak ada yang mencegah Anda membatasi menjadi terisolasi virtualenvjika Anda mau.
Ioannis Filippidis

Satu alasan bagus untuk tidak menggunakannya adalah ketika Anda mendistribusikan atau menggunakan aplikasi atau program Anda, orang lain / server tidak akan memiliki paket situs global Anda. Jika Anda satu-satunya orang yang menggunakan aplikasi ini, maka lakukan apa pun yang Anda inginkan.
Andbdrew

5

Saya ambil:

#!/usr/bin/env python3

import pkg_resources

dists = [str(d).replace(" ","==") for d in pkg_resources.working_set]
for i in dists:
    print(i)

2

Inilah cara untuk melakukannya dengan menggunakan PYTHONPATHalih-alih jalur absolut dari dir python libs Anda:

for d in `echo "${PYTHONPATH}" | tr ':' '\n'`; do ls "${d}"; done

[ 10:43 Jonathan@MacBookPro-2 ~/xCode/Projects/Python for iOS/trunk/Python for iOS/Python for iOS ]$ for d in `echo "$PYTHONPATH" | tr ':' '\n'`; do ls "${d}"; done
libpython2.7.dylib pkgconfig          python2.7
BaseHTTPServer.py      _pyio.pyc              cgitb.pyo              doctest.pyo            htmlentitydefs.pyc     mimetools.pyc          plat-mac               runpy.py               stringold.pyc          traceback.pyo
BaseHTTPServer.pyc     _pyio.pyo              chunk.py               dumbdbm.py             htmlentitydefs.pyo     mimetools.pyo          platform.py            runpy.pyc              stringold.pyo          tty.py
BaseHTTPServer.pyo     _strptime.py           chunk.pyc              dumbdbm.pyc            htmllib.py             mimetypes.py           platform.pyc           runpy.pyo              stringprep.py          tty.pyc
Bastion.py             _strptime.pyc          chunk.pyo              dumbdbm.pyo            htmllib.pyc            mimetypes.pyc          platform.pyo           sched.py               stringprep.pyc         tty.pyo
Bastion.pyc            _strptime.pyo          cmd.py
....


1

Jika ini diperlukan untuk dijalankan dari dalam python, Anda bisa menjalankan subproses

from subprocess import PIPE, Popen

pip_process = Popen(["pip freeze"], stdout=PIPE,
                   stderr=PIPE, shell=True)
stdout, stderr = pip_process.communicate()
print(stdout.decode("utf-8"))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.