Làm thế nào để liệt kê tất cả các gói đã cài đặt và các phiên bản của chúng trong Python?


128

Có cách nào trong Python để liệt kê tất cả các gói đã cài đặt và các phiên bản của chúng không?

Tôi biết tôi có thể vào trong python/Lib/site-packagesvà xem những tập tin và thư mục nào tồn tại, nhưng tôi thấy điều này rất khó xử. Những gì tôi đang tìm kiếm một cái gì đó tương tự npm listnhư npm-ls .


Câu trả lời:


196

Nếu bạn đã cài đặt pip và bạn muốn xem những gói nào đã được cài đặt với các công cụ cài đặt của mình, bạn chỉ cần gọi đây là:

pip freeze

Nó cũng sẽ bao gồm số phiên bản cho các gói được cài đặt.

Cập nhật

Pip đã được cập nhật để tạo ra cùng một đầu ra như pip freezebằng cách gọi:

pip list

Ghi chú

Đầu ra từ pip listđược định dạng khác nhau, vì vậy nếu bạn có một số tập lệnh shell phân tích cú pháp đầu ra (có thể để lấy số phiên bản) freezevà muốn thay đổi tập lệnh của bạn để gọi list, bạn sẽ cần thay đổi mã phân tích cú pháp của mình.


9
IMHO họ nên cung cấp pip listnhư một bí danh cho pip freeze. Nó trực quan để viết pip freeze > requirements.txt, nhưng không pip freeze.
jsalonen

3
WOW: Chỉ cần xem tài liệu về phiên bản mới nhất của pip và có vẻ như họ đã thêm pip list: pip-installer.org/en/latest/usage.html#pip-list - vì vậy đây thực sự là thứ gì đó đã đến!
jsalonen

51

help('modules') nên làm điều đó cho bạn

trong 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
Thật tiện dụng! Tôi cũng thích xem các phiên bản.
jsalonen

4
Tôi nghĩ vấn đề là theres không có tiêu chuẩn hóa cách bao gồm phiên bản ... đôi khi nó Package.version()hay package.__version__hay package.verhay bất kỳ số lượng các khả năng khác
Joran Beasley

Tôi nghĩ phương châm của con trăn là "chỉ có một cách để làm điều đó";)?
Ed Randall

3
@EdRandall, không - đó là "một cách rõ ràng để làm điều đó". Luôn luôn có một cách khó hiểu. Ngoài ra, từ ngữ chính xác là: Nên có một - và tốt nhất là chỉ có một cách rõ ràng để làm điều đó. Mặc dù cách đó ban đầu có thể không rõ ràng trừ khi bạn là người Hà Lan.
rosuav

30

Nếu bạn muốn nhận thông tin về các bản phân phối python đã cài đặt của mình và không muốn sử dụng bảng điều khiển cmd hoặc thiết bị đầu cuối cho nó, nhưng thông qua mã python, bạn có thể sử dụng mã sau (đã thử nghiệm với python 3.4):

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

Lệnh pip.get_installed_distributions(local_only=True)gọi hàm trả về một lần lặp và do vòng lặp for và chức năng in, các phần tử có trong vòng lặp được in ra được phân tách bằng các ký tự dòng mới ( \n). Kết quả sẽ (tùy thuộc vào các bản phân phối được cài đặt của bạn) trông giống như thế này:

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
Để mở rộng nhận xét của @ shoutuma, với pip 10, bạn nên sử dụng: nhập pkg_resource [print (d.project_name) cho d trong pkg_resource.usiness_set]
Almenon

Trạng thái của pkg_resourcescái gì? AFAICR đây là một phần của setuptools. Không phải pip. Chúng ta có thể giả định một cách an toàn rằng setuptoolssẽ luôn luôn có sẵn khi chỉ phụ thuộc vào pip?
shoutuma

9

Bạn có thể thử: lòng đỏ

Để cài đặt lòng đỏ, hãy thử:

easy_install yolk

Yolk là một công cụ Python để lấy thông tin về các gói Python đã cài đặt và các gói truy vấn có sẵn trên PyPI (Chỉ số gói Python).

Bạn có thể xem gói nào đang hoạt động, không hoạt động hoặc trong chế độ phát triển và hiển thị cho bạn gói nào có phiên bản mới hơn bằng cách truy vấn PyPI.


Tôi thường sử dụng pip cho nhiệm vụ này vào thời điểm này, nhưng tôi có một dự án rất cũ mà tôi chưa sẵn sàng để thêm phân phối vào, và tôi nhớ có một công cụ như thế này ngoài kia. Không thể nhớ nó được gọi là gì ... Đây là nó!
lướiantz

1
Nó không hỗ trợ python 3 (chỉ được cài đặt từ pip và gặp lỗi thời gian chạy)
Ohad Cohen

9

Để chạy phiên bản này trong các phiên bản sau của pip (đã thử nghiệm pip==10.0.1), hãy sử dụng như sau:

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

Tình trạng nội bộ là gì ?. Tôi thấy pydoc pip._internalnhưng tôi không thể với tới bên dưới help(pip._internal), pip .__ buildins_ v.v ... hướng dẫn tham khảo pip cũng trống.
MortenB

1
Thật không may, tôi không biết. Tôi cũng không thích nó được gọi _internal. Có vẻ như các chức năng không được tiếp xúc chính thức. Vì vậy, bạn nên xử lý việc này một cách cẩn thận!
shoutuma

8

từ dòng lệnh

python -c help('modules')

có thể được sử dụng để xem tất cả các mô-đun và cho các mô-đun cụ thể

python -c help('os')

Đối với Linux dưới đây sẽ hoạt động

python -c "help('os')"

5
Điều này hoạt động trên các cửa sổ. Trên linux, nó bị lỗi:-bash: syntax error near unexpected token `('
AjayKumarBasuthkar 11/03/2016

điều này không cung cấp các phiên bản mô-đun
Stepan Yakovenko

5

Đúng! bạn nên sử dụng pip làm trình quản lý gói python của mình ( http://pypi.python.org/pypi/pip )

với các gói cài đặt pip, bạn có thể làm

pip freeze

và nó sẽ liệt kê tất cả các gói được cài đặt. Có lẽ bạn cũng nên sử dụng virtualenvvirtualenvwrapper . Khi bạn bắt đầu một dự án mới, bạn có thể làm

mkvirtualenv my_new_project

và sau đó (bên trong virtualenv), làm

pip install all_your_stuff

Bằng cách này, bạn có thể workon my_new_project và sau đó pip freezeđể xem gói nào được cài đặt cho virtualenv / dự án đó.

ví dụ:

  ~  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)➜  ~  

hoặc nếu bạn có gói python với tệp tests.pip,

mkvirtualenv my_awesome_project
pip install -r requirements.pip
pip freeze

sẽ làm trò bịp


Ồ vâng, tôi đã sử dụng virtualenv một thời gian. Tôi chỉ không biết làm thế nào tôi không biết tôi có thể sử dụng pipcùng với nó theo cách này!
jsalonen

Về virtualenvcác gói trang web toàn cầu, sau đó bạn cần sử dụng pip list --local.
Ioannis Filippidis

@johntex bạn không bao giờ nên sử dụng các gói trang web toàn cầu!
Andbdrew

Sử dụng các gói trang web toàn cầu là rất hữu ích. Nếu không, tùy chọn sẽ không tồn tại virtualenv. Tôi không biết bất kỳ lý do nào cho việc không sử dụng chúng và không ai ngăn cản bạn hạn chế cô lập virtualenvnếu bạn thích.
Ioannis Filippidis

Một lý do tuyệt vời để không sử dụng chúng là khi bạn phân phối hoặc triển khai ứng dụng hoặc chương trình của mình, những người / máy chủ khác sẽ không có các gói trang web toàn cầu của bạn. Nếu bạn là người duy nhất sử dụng ứng dụng, thì hãy làm bất cứ điều gì bạn muốn.
Andbdrew

5

Tôi lấy:

#!/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

Đây là một cách để làm điều đó bằng cách sử dụng PYTHONPATHthay vì đường dẫn tuyệt đối của thư mục libs python của bạn:

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

Nếu điều này là cần thiết để chạy từ bên trong python, bạn có thể gọi tiến trình con

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"))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.