Tìm tất cả các gói được cài đặt với easy_install / pip?


Câu trả lời:


381

pip freezesẽ đưa ra một danh sách các gói đã cài đặt và các phiên bản của chúng. Nó cũng cho phép bạn viết các gói đó vào một tệp mà sau này có thể được sử dụng để thiết lập một môi trường mới.

https://pip.pypa.io/en/urdy/reference/pip_freeze/#pip-freeze


89
Kể từ phiên bản 1.3, "danh sách pip" đã được thêm vào. Xem câu trả lời của tôi dưới đây và các tài liệu ở đây: pip-installer.org/en/latest/usage.html#pip-list
keybits

7
liệt kê và đóng băng các định dạng khác nhau (tại thời điểm viết). Sản lượng đóng băng có thể được sử dụng để tái tạo môi trường: docs.python-guide.org/en/latest/dev/virtualenvs/#other-notes
Tom Saleeba

18
pip freezepip listliệt kê tất cả mọi thứ. Họ không loại trừ các gói không được cài đặt bởi pip.
Eliad

Tôi cũng thấy pip freezeđáng tin cậy trong các tập lệnh, trong khi đó pip listsẽ tạo ra các lỗi không mong muốn khi được sử dụng với các đường ống.
Dale Anderson

2
Câu trả lời mới (?) pip list -lHoặc pip list --locallà câu trả lời hay nhất, xem stackoverflow.com/a/43012269/491884 của @MJB
jmuc

255

Kể từ phiên bản 1.3 của pip, giờ bạn có thể sử dụng pip list

Nó có một số tùy chọn hữu ích bao gồm khả năng hiển thị các gói lỗi thời. Đây là tài liệu: https://pip.pypa.io/en/latest/reference/pip_list/


3
Trên Gentoo, danh sách này liệt kê tất cả các gói, ngay cả những gói được cài đặt bằng các phương tiện khác ngoài pip. Điều này có thực sự loại trừ các mô-đun không được cài đặt trên hệ thống khác theo yêu cầu của câu hỏi không?
jlh

Lưu ý rằng điều này hơi khác so vớipip freeze
sg

1
pip list --userchỉ hiển thị các gói được người dùng cài đặt và không bao gồm các gói trên toàn hệ thống.
Jacob Hume

138

Nếu bất cứ ai thắc mắc, bạn có thể sử dụng lệnh 'pip show'.

pip show [options] <package>

Điều này sẽ liệt kê thư mục cài đặt của gói nhất định.


24

Nếu Debian hoạt động như các phiên bản Ubuntu gần đây về pip installmục tiêu mặc định, thì thật dễ dàng: nó sẽ cài đặt /usr/local/lib/thay vì /usr/lib( aptmục tiêu mặc định). Kiểm tra https://askubfox.com/questions/173323/how-do-i-detect-and-remove-python-packages-installed-via-pip/259747#259747

Tôi là người dùng ArchLinux và khi tôi thử nghiệm với pip, tôi đã gặp vấn đề tương tự. Đây là cách tôi giải quyết nó trong Arch.

find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs pacman -Qo | grep 'No package'

Điều quan trọng ở đây là /usr/lib/python2.7/site-packages, thư mục pip cài đặt, YMMV. pacman -Qolà cách Arch của pac kage người đàn ông kiểm tra AGER cho quyền sở hữu của tập tin. No packagelà một phần của lợi nhuận mà nó mang lại khi không có gói nào sở hữu tệp : error: No package owns $FILENAME. Cách giải quyết rắc rối: Tôi đang truy vấn __init__.pypacman -Qohơi thờ ơ khi nói đến thư mục :(

Để làm điều đó cho các bản phát hành khác, bạn phải tìm ra nơi pipcài đặt công cụ (chỉ là sudo pip installthứ gì đó), cách truy vấn quyền sở hữu tệp (phương thức Debian / Ubuntu dpkg -S) và trả về "không có gói nào sở hữu đường dẫn đó" (Debian / Ubuntu là no path found matching pattern). Người dùng Debian / Ubuntu, hãy cẩn thận: dpkg -Ssẽ thất bại nếu bạn cung cấp cho nó một liên kết tượng trưng. Chỉ cần giải quyết nó đầu tiên bằng cách sử dụng realpath. Như thế này:

find /usr/local/lib/python2.7/dist-packages -maxdepth 2 -name __init__.py | xargs realpath | xargs dpkg -S 2>&1 | grep 'no path found'

Người dùng Fedora có thể dùng thử (cảm ơn @eddygeek):

find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'

2
+1 Cảm ơn rất nhiều về Arch-liner, đó chính xác là những gì tôi đang tìm kiếm. Nhân tiện, sự thật tò mò: bản cài đặt Arch của tôi được bản địa hóa bằng tiếng Ý, nhưng grep chính xác là 'grepping' những dòng chữ 'Nessun pacchetto' (tiếng Ý nghĩa là 'Không có gói') mặc dù tôi đã tham gia 'Không có gói'. Làm thế nào mà?
Nadir Sampaoli

1
@barraponto @NadirSampaoli grep không làm gì trong trường hợp của tôi. Bởi vì grep cố gắng grep trong stdout, nhưng dpkgviết lỗi vào stderr nên tôi phải thêm một chuyển hướng 2>&1. Và cho đầu ra quốc tế thêm LANG= trước mặt xargs dpkg -s. và sedcũng là một công cụ hay;) chỉ giữ tên gói của đường dẫn. Vì vậy, tôi kết thúc với: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
xin chào, tôi đã đánh giá sai điều này và chỉ nhận ra điều đó, và bây giờ phiếu bầu của tôi đã bị khóa. Ai đó có thể bỏ phiếu này để vô hiệu hóa downvote của tôi không? Cảm ơn
Jonathan

22

Bắt đầu với:

$ pip list

Để liệt kê tất cả các gói. Khi bạn tìm thấy gói bạn muốn, hãy sử dụng:

$ pip show <package-name>

Điều này sẽ cho bạn thấy chi tiết về gói này, bao gồm cả thư mục của nó. Bạn có thể bỏ qua phần đầu tiên nếu bạn đã biết tên gói

Nhấn vào đây để biết thêm thông tin về chương trình pip và ở đây để biết thêm thông tin về danh sách pip.

Thí dụ:

$ 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    

Câu trả lời hay nhất IMHO. Thực sự đơn giản và nhanh chóng nếu tôi biết tên gói. Danh sách pip thậm chí không cần thiết và việc đóng băng có thể mất nhiều thời gian và tôi phải lọc ra những thứ tôi không quan tâm. Đơn giản: pip chương my_packge
ChuckZ

8

pip.get_installed_distributions() sẽ đưa ra một danh sách các gói đã cài đặt

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

2
Điều này sẽ không hoạt động nữa. Xem github.com/pypa/pip/issues/5243 Thay vào đó, bạn nên sử dụng: nhập pkg_resource [print (d.project_name) cho d trong pkg_resource.usiness_set]
Almenon

6

Dưới đây là một chút chậm, nhưng nó cung cấp một danh sách các gói được định dạng độc đáo mà pipnhận thức được. Điều đó có nghĩa là, không phải tất cả chúng đều được cài đặt "bởi" pip, nhưng tất cả chúng đều có thể được nâng cấp bằng pip.

$ pip search . | egrep -B1 'INSTALLED|LATEST'

Lý do nó chậm là vì nó liệt kê nội dung của toàn bộ repo pypi. Tôi đã nộp một đề nghị pip listcung cấp chức năng tương tự nhưng hiệu quả hơn.

Đầu ra mẫu: (giới hạn tìm kiếm trong một tập hợp con thay vì '.' Cho tất cả.)

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

Tại sao không tự nộp vé?
lajarre

1
Rõ ràng phiên bản tiếp theo của pip sẽ có lệnh danh sách mới: pip-installer.org/en/latest/usage.html#pip-list
MarkHu

5

Thêm vào câu trả lời của @Paul Woolcock,

pip freeze > requirements.txt

sẽ tạo một tệp yêu cầu với tất cả các gói đã cài đặt cùng với số phiên bản đã cài đặt trong môi trường hoạt động tại vị trí hiện tại. Đang chạy

pip install -r requirements.txt

sẽ cài đặt các gói được chỉ định trong tệp yêu cầu.


5

Các phiên bản mới hơn của pip có khả năng thực hiện những gì OP muốn thông qua pip list -lhoặc pip freeze -l( --list).
Trên Debian (ít nhất), trang man không làm rõ điều này và tôi chỉ phát hiện ra nó - với giả định rằng tính năng này phải tồn tại - với pip list --help.

Có những ý kiến ​​gần đây cho thấy tính năng này không rõ ràng trong tài liệu hoặc câu trả lời hiện có (mặc dù được gợi ý bởi một số), vì vậy tôi nghĩ rằng tôi nên đăng. Tôi muốn có một nhận xét như vậy, nhưng tôi không có điểm danh tiếng.


1
Hóa ra chúng tôi đã có pip freeze --local8 năm. pip list --localcũng có sẵn ... nhưng lưu ý rằng câu hỏi OP không phải là về môi trường ảo ( --localhỗ trợ) mà là về các gói phân phối sành điệu từ sudo pip installcác gói.
Capi Etheriel

4

Xin lưu ý rằng nếu bạn có nhiều phiên bản Python được cài đặt trên máy tính của mình, bạn có thể có một vài phiên bản pip được liên kết với nhau.

Tùy thuộc vào các hiệp hội của bạn, bạn có thể cần phải rất thận trọng với lệnh pip bạn sử dụng:

pip3 list 

Làm việc cho tôi, nơi tôi đang chạy Python3.4. Đơn giản chỉ cần sử dụngpip list trả lại lỗi The program 'pip' is currently not installed. You can install it by typing: sudo apt-get install python-pip.


pip là cho python2.7, pip3 là cho python3.x
mjp

3

Như @almenon đã chỉ ra, điều này không còn hoạt động nữa và nó không phải là cách được hỗ trợ để lấy thông tin gói trong mã của bạn. Sau đây đưa ra một ngoại lệ:

import pip
installed_packages = dict([(package.project_name, package.version) 
                           for package in pip.get_installed_distributions()])

Để thực hiện điều này, bạn có thể nhập khẩu pkg_resources. Đây là một ví dụ:

import pkg_resources
installed_packages = dict([(package.project_name, package.version)
                           for package in pkg_resources.working_set])

Tôi đang trên v3.6.5


2

Dưới đây là một lớp lót cho fedora hoặc các bản phát hành vòng / phút khác (dựa trên mẹo @barraponto):

find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'

Nối phần này vào lệnh trước để có đầu ra sạch hơn:

 | sed -r 's:.*/(\w+)/__.*:\1:'

1

Nhận tất cả các tên tệp / thư mục trong site-packages/(và dist-packages/nếu nó tồn tại) và sử dụng trình quản lý gói của bạn để loại bỏ các tên đã được cài đặt qua gói.


1

pip đóng băng liệt kê tất cả các gói đã cài đặt ngay cả khi không bằng pip / easy_install. Trên CentOs / Redhat một gói được cài đặt qua vòng / phút được tìm thấy.


1

Nếu bạn sử dụng phân phối trăn Anaconda , bạn có thể sử dụng conda listlệnh để xem những gì đã được cài đặt bằng phương thức nào:

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

Để lấy các mục được cài đặt bởi pip(bao gồm cả pipchính nó):

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>

Tất nhiên bạn có thể chỉ muốn chọn cột đầu tiên, bạn có thể làm gì (không bao gồm pipnếu cần):

user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}'
amqp        
astroid
billiard
blinker
ez-setup
feedgenerator 

Cuối cùng, bạn có thể lấy các giá trị này và gỡ cài đặt tất cả chúng bằng cách sau:

user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}' | xargs pip uninstall -y

Lưu ý việc sử dụng -ycờ cho pip uninstallđể tránh phải đưa ra xác nhận để xóa.


1

Đối với những người chưa cài đặt pip, tôi đã tìm thấy tập lệnh nhanh này trên github (hoạt động với Python 2.7.13):

import pkg_resources
distros = pkg_resources.AvailableDistributions()
for key in distros:
  print distros[key]


0

Ít nhất là cho Ubuntu (cũng có thể là những người khác) làm việc này (lấy cảm hứng từ một bài viết trước trong chủ đề này):

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