Có cách nào để tìm tất cả các gói Python PyPI đã được cài đặt với easy_install hoặc pip không? Ý tôi là, loại trừ mọi thứ đã / được cài đặt bằng các công cụ phân phối (trong trường hợp này là apt-get trên Debian).
Có cách nào để tìm tất cả các gói Python PyPI đã được cài đặt với easy_install hoặc pip không? Ý tôi là, loại trừ mọi thứ đã / được cài đặt bằng các công cụ phân phối (trong trường hợp này là apt-get trên Debian).
Câu trả lời:
pip freeze
sẽ đư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
pip freeze
và pip list
liệ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
.
pip freeze
đáng tin cậy trong các tập lệnh, trong khi đó pip list
sẽ tạo ra các lỗi không mong muốn khi được sử dụng với các đường ống.
pip list -l
Hoặc pip list --local
là câu trả lời hay nhất, xem stackoverflow.com/a/43012269/491884 của @MJB
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/
pip freeze
pip list --user
chỉ 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.
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.
Nếu Debian hoạt động như các phiên bản Ubuntu gần đây về pip install
mục tiêu mặc định, thì thật dễ dàng: nó sẽ cài đặt /usr/local/lib/
thay vì /usr/lib
( apt
mụ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 -Qo
là 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 package
là 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__.py
vì pacman -Qo
hơ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 pip
cài đặt công cụ (chỉ là sudo pip install
thứ 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 -S
sẽ 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'
dpkg
viế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à sed
cũ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/"
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
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
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à pip
nhậ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 vé đề nghị pip list
cung 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)
$
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.
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 -l
hoặ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.
pip freeze --local
8 năm. pip list --local
cũ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 ( --local
hỗ trợ) mà là về các gói phân phối sành điệu từ sudo pip install
các gói.
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
.
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
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:'
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.
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.
Nếu bạn sử dụng phân phối trăn Anaconda , bạn có thể sử dụng conda list
lệ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ả pip
chí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 pip
nế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 -y
cờ cho pip uninstall
để tránh phải đưa ra xác nhận để xóa.
danh sách pip [tùy chọn] Bạn có thể xem tài liệu tham khảo đầy đủ ở đây
Í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