簡體   English   中英

查找所有使用 easy_install/pip 安裝的軟件包?

[英]Find all packages installed with easy_install/pip?

有沒有辦法找到所有使用 easy_install 或 pip 安裝的 Python PyPI 包? 我的意思是,不包括使用分發工具安裝/安裝的所有內容(在本例中為 Debian 上的 apt-get)。

pip freeze將 output 列出已安裝的軟件包及其版本。 它還允許您將這些包寫入一個文件,該文件以后可用於設置新環境。

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

從 pip 的 1.3 版開始,您現在可以使用pip list

它有一些有用的選項,包括顯示過時軟件包的能力。 這是文檔: https://pip.pypa.io/en/latest/reference/pip_list/

如果有人想知道您可以使用“pip show”命令。

pip show [options] <package>

這將列出給定 package 的安裝目錄。

從...開始:

$ pip list

列出所有包。 找到所需的 package 后,請使用:

$ pip show <package-name>

這將向您顯示有關此 package 的詳細信息,包括其文件夾。 如果您已經知道 package 名稱,則可以跳過第一部分

單擊此處了解有關 pip 展示的更多信息,單擊此處了解有關 pip 列表的更多信息。

例子:

$ 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    

如果 Debian 表現得像最近的 Ubuntu 版本,關於pip install默認目標,它很容易:它安裝到/usr/local/lib/ /usr/lib apt默認目標)。 檢查https://askubuntu.com/questions/173323/how-do-i-detect-and-remove-python-packages-installed-via-pip/259747#259747

我是 ArchLinux 用戶,當我嘗試使用 pip 時,我遇到了同樣的問題。 這是我在 Arch 中解決它的方法。

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

這里的關鍵是/usr/lib/python2.7/site-packages ,這是 pip 安裝到 YMMV 的目錄。 pacman -Qo是 Arch管理器檢查文件所有權的方式。 No package是它在沒有 package 擁有文件時給出的回報的一部分: error: No package owns $FILENAME 棘手的解決方法:我正在查詢__init__.py因為pacman -Qo在涉及目錄時有點無知:(

In order to do it for other distros, you have to find out where pip installs stuff (just sudo pip install something), how to query ownership of a file (Debian/Ubuntu method is dpkg -S ) and what is the "no package擁有該路徑”返回(Debian/Ubuntu no path found matching pattern )。 Debian/Ubuntu 用戶,請注意:如果你給它一個符號鏈接, dpkg -S將會失敗。 只需先使用realpath解決它。 像這樣:

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

Fedora 用戶可以嘗試(感謝@eddygeek):

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

pip.get_installed_distributions()將給出已安裝軟件包的列表

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

較新版本的 pip 能夠通過pip list -lpip freeze -l ( --list ) 執行 OP 想要的操作。
在 Debian (至少)上,手冊頁沒有說明這一點,我只是在假設該功能必須存在的情況下才發現它pip list --help

最近有評論表明此功能在文檔或現有答案中並不明顯(盡管有人暗示),所以我認為我應該發布。 我更願意這樣做作為評論,但我沒有聲譽積分。

下面有點慢,但它提供了pip知道的格式良好的包列表。 也就是說,並非所有這些都是“由”pip“安裝”的,但應該都可以由pip升級。

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

它慢的原因是它列出了整個 pypi repo 的內容。 我提交了一張票,建議pip list提供類似的功能但更有效。

示例 output:(將搜索限制為子集,而不是全部的“.”。)

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

添加到@Paul Woolcock 的答案,

pip freeze > requirements.txt

將在當前位置的活動環境中創建一個包含所有已安裝軟件包以及已安裝版本號的需求文件 跑步

pip install -r requirements.txt

將安裝需求文件中指定的包。

請注意,如果您的計算機上安裝了多個版本的 Python,則可能有幾個版本的 pip 與每個版本相關聯。

根據您的關聯,您可能需要對使用的 pip 命令非常謹慎:

pip3 list 

為我工作,我正在運行 Python3.4。 簡單地使用pip list返回錯誤The program 'pip' is currently not installed. You can install it by typing: sudo apt-get install python-pip The program 'pip' is currently not installed. You can install it by typing: sudo apt-get install python-pip

正如@almenon 指出的那樣,這不再有效,並且它不是在代碼中獲取 package 信息的受支持方式。 以下引發異常:

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

為此,您可以導入pkg_resources 這是一個例子:

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

我在v3.6.5

這是 Fedora 或其他 rpm 發行版的單行代碼(基於 @barraponto 提示):

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

Append 這到前面的命令以獲得更清潔的 output:

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

pip freeze 會列出所有已安裝的軟件包,即使不是通過 pip/easy_install。 在 CentOs/Redhat 上找到了一個通過 rpm 安裝的 package。

如果使用Anaconda python 發行版,可以使用 conda conda list命令查看是通過什么方法安裝的:

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

要獲取pip安裝的條目(可能包括pip本身):

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>

當然,您可能只想 select 第一列,您可以使用它(如果需要,不包括pip ):

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

最后,您可以獲取這些值,然后 pip 使用以下命令將它們全部卸載:

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

請注意在pip uninstall中使用-y標志,以避免必須確認刪除。

對於那些沒有安裝 pip 的人,我在 github 上找到了這個快速腳本(適用於Python 2.7.13):

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

pip 列表 [選項] 你可以在這里看到完整的參考

獲取site-packages/ (和dist-packages/如果存在)中的所有文件/文件夾名稱,並使用 package 管理器刪除通過 package 安裝的文件/文件夾名稱。

至少對於 Ubuntu (也許還有其他人)可以這樣做(受此線程上一篇文章的啟發):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM