ค้นหาแพ็คเกจทั้งหมดที่ติดตั้งด้วย easy_install / pip หรือไม่


400

มีวิธีในการค้นหาแพ็คเกจ Python PyPI ทั้งหมดที่ติดตั้งกับ easy_install หรือ pip หรือไม่? ฉันหมายความว่าไม่รวมทุกอย่างที่ติดตั้ง / พร้อมเครื่องมือการกระจาย (ในกรณีนี้คือ apt-get บน Debian)


คำตอบ:


381

pip freezeจะแสดงรายการของแพ็คเกจที่ติดตั้งและเวอร์ชั่นของมัน นอกจากนี้ยังช่วยให้คุณสามารถเขียนแพ็คเกจเหล่านั้นไปยังไฟล์ที่สามารถใช้ในภายหลังเพื่อตั้งค่าสภาพแวดล้อมใหม่

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


89
ในฐานะของเวอร์ชัน 1.3 ได้เพิ่มรายการ 'pip' ดูคำตอบของฉันด้านล่างและเอกสารได้ที่นี่: pip-installer.org/en/latest/usage.html#pip-list
keybits

7
รายการและรูปแบบที่แตกต่างเอาท์พุทแช่แข็ง (ณ เวลาของการเขียน) เอาต์พุตการตรึงสามารถใช้เพื่อสร้างสภาพแวดล้อม: docs.python-guide.org/en/latest/dev/virtualenvs/#other-notes
Tom Saleeba

18
pip freezeและpip listรายการทุกอย่าง pipพวกเขาไม่ได้ยกเว้นแพคเกจที่ไม่ได้ถูกติดตั้งโดย
Eliad

ฉันยังพบว่าpip freezeมีความน่าเชื่อถือในสคริปต์ในขณะที่pip listจะสร้างข้อผิดพลาดที่ไม่คาดคิดเมื่อใช้กับไพพ์
เดลเดอร์สัน

2
ใหม่ (?) pip list -lหรือpip list --localเป็นคำตอบที่ดีที่สุดดูstackoverflow.com/a/43012269/491884โดย @MJB
jmuc

255

ในเวอร์ชัน 1.3 ของ pip คุณสามารถใช้งานได้แล้ว pip list

มีตัวเลือกที่มีประโยชน์รวมถึงความสามารถในการแสดงแพ็คเกจที่ล้าสมัย นี่คือเอกสาร: https://pip.pypa.io/en/latest/reference/pip_list/


3
บน Gentoo รายการนี้จะแสดงรายการแพ็คเกจทั้งหมดแม้จะติดตั้งด้วยวิธีอื่นนอกเหนือจาก pip สิ่งนี้ไม่รวมโมดูลที่ไม่ได้ติดตั้ง pip ในระบบอื่น ๆ ตามที่ร้องขอหรือไม่
jlh

โปรดทราบว่านี้จะแตกต่างกันเล็กน้อยจากpip freeze
SG

1
pip list --userแสดงเฉพาะแพ็คเกจที่ติดตั้งโดยผู้ใช้และไม่รวมแพ็คเกจทั่วทั้งระบบ
Jacob Hume

138

หากใครสงสัยว่าคุณสามารถใช้คำสั่ง 'pip show'

pip show [options] <package>

จะแสดงรายการไดเรกทอรีการติดตั้งของแพ็คเกจที่กำหนด


24

ถ้า Debian ทำงานเหมือนเวอร์ชัน Ubuntu ล่าสุดเกี่ยวกับpip installเป้าหมายเริ่มต้นมันง่ายมาก: ติดตั้ง/usr/local/lib/แทน/usr/lib( aptเป้าหมายเริ่มต้น) ตรวจสอบ/ubuntu/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 pac kage man ager จะตรวจสอบความเป็นเจ้าของไฟล์pacman -Qoของ Arch อย่างไร เป็นส่วนหนึ่งของการกลับมามันจะช่วยให้เมื่อแพคเกจไม่เป็นเจ้าของไฟล์: วิธีแก้ปัญหาหากิน: ฉันกำลังสอบถามเพราะNo packageerror: No package owns $FILENAME__init__.pypacman -Qoเล็กน้อยไม่รู้เมื่อมันมาถึงไดเรกทอรี :(

ในการที่จะทำเพื่อ distros อื่น ๆ คุณจะต้องค้นหาสิ่งที่pipติดตั้ง (เพียงsudo pip installบางอย่าง) วิธีการสอบถามความเป็นเจ้าของไฟล์ (วิธี Debian / Ubuntu คือdpkg -S) และสิ่งที่ "คืนแพ็คเกจไม่มี" เป็นวิธีการที่ (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'

2
+1 ขอบคุณมากสำหรับ Arch one-liner นั่นคือสิ่งที่ฉันกำลังมองหา โดยข้อเท็จจริงแล้วความอยากรู้อยากเห็น: การติดตั้ง Arch ของฉันมีการแปลเป็นภาษาอิตาลี แต่ grep ถูกต้อง 'grepped' บรรทัดที่ระบุว่า 'Nessun pacchetto' (ภาษาอิตาลีสำหรับ 'ไม่มีแพ็คเกจ') แม้ว่าฉันจะ grepping สำหรับ 'ไม่มีแพ็คเกจ' มาทำไม
ขีดตกต่ำสุด Sampaoli

1
@barraponto @NadirSampaoli grep ไม่ทำอะไรเลยในกรณีของฉัน เพราะพยายามที่จะ grep grep ใน stdout แต่dpkgเขียนข้อผิดพลาดในการ stderr 2>&1ดังนั้นผมจึงต้องเพิ่มการเปลี่ยนเส้นทาง และสำหรับการส่งออกต่างประเทศเพิ่มในด้านหน้าของLANG= xargs dpkg -sและsedยังเป็นเครื่องมือที่ดี;) เพื่อเก็บเฉพาะชื่อแพ็คเกจของเส้นทาง ดังนั้นฉันจึงลงท้ายด้วย: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
สวัสดีฉันลงคะแนนครั้งนี้ด้วยความผิดพลาดและเพิ่งเข้าใจได้และตอนนี้การลงคะแนนของฉันล็อคแล้วมีคนโหวตให้ฉันเพื่อแก้ปัญหา downvote ของฉันได้หรือไม่ ขอบคุณ
Jonathan

22

เริ่มกับ:

$ pip list

เพื่อแสดงรายการแพ็คเกจทั้งหมด เมื่อคุณพบแพ็คเกจที่คุณต้องการแล้วให้ใช้:

$ pip show <package-name>

นี่จะแสดงรายละเอียดเกี่ยวกับแพ็คเกจนี้รวมถึงโฟลเดอร์ คุณสามารถข้ามส่วนแรกหากคุณรู้ชื่อแพ็คเกจแล้ว

คลิกที่นี่สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการแสดง 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    

คำตอบที่ดีที่สุด IMHO ง่ายและรวดเร็วจริงๆถ้าฉันรู้ชื่อแพ็คเกจ รายการ pip ไม่จำเป็นและการตรึงอาจใช้เวลานานและฉันต้องกรองสิ่งที่ฉันไม่สนใจ ง่าย ๆ : pip แสดง my_packge
ChuckZ

8

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

2
สิ่งนี้จะไม่ทำงานอีกต่อไป ดูgithub.com/pypa/pip/issues/5243 แต่คุณควรใช้: import pkg_resources [print (d.project_name) สำหรับ d ใน pkg_resources.working_set]
Almenon

6

ด้านล่างจะช้าเล็กน้อย แต่ให้รายชื่อแพคเกจรูปแบบที่pipทราบ กล่าวได้ว่าไม่ใช่ทั้งหมดของพวกเขาถูกติดตั้ง "โดย" pip แต่พวกเขาทั้งหมดควรจะสามารถอัพเกรดโดย pip

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

เหตุผลที่ช้าก็คือมันแสดงรายการเนื้อหาของ pypi repo ทั้งหมด ฉันยื่นตั๋วเพื่อแนะนำการpip listทำงานที่คล้ายกัน แต่มีประสิทธิภาพมากกว่า

ตัวอย่างผลลัพธ์: (จำกัด การค้นหาไว้ที่ชุดย่อยแทนที่จะเป็น '.' สำหรับทุกคน)

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

ทำไมไม่ยื่นตั๋วเอง
lajarre

1
เห็นได้ชัดว่า pip รุ่นถัดไปจะมีคำสั่ง list ใหม่: pip-installer.org/en/latest/usage.html#pip-list
MarkHu

5

กำลังเพิ่มคำตอบของ @Paul Woolcock

pip freeze > requirements.txt

จะสร้างไฟล์ข้อกำหนดพร้อมกับแพ็คเกจที่ติดตั้งทั้งหมดพร้อมกับหมายเลขเวอร์ชันที่ติดตั้งในสภาพแวดล้อมการใช้งานที่ตำแหน่งปัจจุบัน วิ่ง

pip install -r requirements.txt

จะติดตั้งแพ็คเกจที่ระบุในไฟล์ข้อกำหนด


5

pip รุ่นใหม่กว่ามีความสามารถในการทำสิ่งที่ OP ต้องการผ่านpip list -lหรือpip freeze -l( --list)
ใน Debian (อย่างน้อย) หน้าคนไม่ได้ทำให้ชัดเจนและฉันค้นพบมัน - ภายใต้ข้อสันนิษฐานว่าคุณลักษณะต้องมีอยู่ - ด้วยpip list --helpภายใต้สมมติฐานว่าคุณสมบัติจะต้องมีอยู่ด้วย

มีความคิดเห็นล่าสุดที่แนะนำคุณสมบัตินี้ไม่ชัดเจนทั้งในเอกสารหรือคำตอบที่มีอยู่ (แม้ว่าบางคนจะได้รับคำแนะนำ) ดังนั้นฉันคิดว่าฉันควรโพสต์ ฉันอยากจะแสดงความคิดเห็น แต่ฉันไม่มีคะแนนชื่อเสียง


1
ปรากฎว่าเรามีpip freeze --localเวลา 8 ปี pip list --localพร้อมใช้งานด้วย ... แต่สังเกตเห็นว่าคำถาม OP ไม่ได้เกี่ยวกับสภาพแวดล้อมเสมือนจริง (ซึ่ง--localรองรับ) แต่เกี่ยวกับการแยกบรรจุภัณฑ์จากsudo pip installแพ็คเกจ
Capi Etheriel

4

พึงระลึกไว้ว่าหากคุณติดตั้ง Python หลายเวอร์ชันไว้ในคอมพิวเตอร์ของคุณคุณอาจมีจุดเล็ก ๆ น้อย ๆ ที่เชื่อมโยงกัน

คุณอาจต้องใช้ความระมัดระวังในการใช้คำสั่ง pip ที่คุณใช้:

pip3 list 

ทำงานให้ฉันที่ฉันใช้ Python3.4 เพียงแค่ใช้กลับข้อผิดพลาดpip listThe program 'pip' is currently not installed. You can install it by typing: sudo apt-get install python-pip


pip สำหรับ python2.7, pip3 สำหรับ
python3.x

3

ดังที่ @almenon ชี้ให้เห็นว่าวิธีนี้ใช้ไม่ได้อีกต่อไปและไม่ใช่วิธีที่ได้รับการสนับสนุนในการรับข้อมูลแพ็คเกจในรหัสของคุณ ข้อยกเว้นต่อไปนี้ทำให้เกิดข้อยกเว้น:

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


2

นี่คือสายการบินเดียวสำหรับ fedora หรือ distros รอบต่อนาทีอื่น ๆ (ตามคำแนะนำ @barraponto):

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

ผนวกสิ่งนี้กับคำสั่งก่อนหน้าเพื่อรับเอาต์พุตที่สะอาดขึ้น:

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

1

รับชื่อไฟล์ / โฟลเดอร์ทั้งหมดในsite-packages/(และdist-packages/ถ้ามี) และใช้เครื่องมือจัดการแพ็คเกจเพื่อดึงไฟล์ที่ติดตั้งผ่านแพ็คเกจ


1

pip freeze จะแสดงรายการแพ็คเกจที่ติดตั้งทั้งหมดแม้ว่าจะไม่ได้ใช้ pip / easy_install บน CentOs / Redhat พบแพ็คเกจที่ติดตั้งผ่าน rpm


1

ถ้าคุณใช้งูกระจายหลามคุณสามารถใช้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>

แน่นอนคุณอาจต้องการเลือกคอลัมน์แรกซึ่งคุณสามารถทำได้ด้วย (ยกเว้น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

หมายเหตุการใช้-yแฟล็กสำหรับpip uninstallเพื่อหลีกเลี่ยงการต้องให้การยืนยันเพื่อลบ


1

สำหรับผู้ที่ไม่ได้ติดตั้ง pip ฉันพบสคริปต์สั้น ๆ นี้ในgithub (ใช้ได้กับ Python 2.7.13):

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


0

อย่างน้อยสำหรับ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.