มีวิธีในการค้นหาแพ็คเกจ Python PyPI ทั้งหมดที่ติดตั้งกับ easy_install หรือ pip หรือไม่? ฉันหมายความว่าไม่รวมทุกอย่างที่ติดตั้ง / พร้อมเครื่องมือการกระจาย (ในกรณีนี้คือ apt-get บน Debian)
มีวิธีในการค้นหาแพ็คเกจ Python PyPI ทั้งหมดที่ติดตั้งกับ easy_install หรือ pip หรือไม่? ฉันหมายความว่าไม่รวมทุกอย่างที่ติดตั้ง / พร้อมเครื่องมือการกระจาย (ในกรณีนี้คือ apt-get บน Debian)
คำตอบ:
pip freeze
จะแสดงรายการของแพ็คเกจที่ติดตั้งและเวอร์ชั่นของมัน นอกจากนี้ยังช่วยให้คุณสามารถเขียนแพ็คเกจเหล่านั้นไปยังไฟล์ที่สามารถใช้ในภายหลังเพื่อตั้งค่าสภาพแวดล้อมใหม่
https://pip.pypa.io/en/stable/reference/pip_freeze/#pip-freeze
pip freeze
และpip list
รายการทุกอย่าง pip
พวกเขาไม่ได้ยกเว้นแพคเกจที่ไม่ได้ถูกติดตั้งโดย
pip freeze
มีความน่าเชื่อถือในสคริปต์ในขณะที่pip list
จะสร้างข้อผิดพลาดที่ไม่คาดคิดเมื่อใช้กับไพพ์
pip list -l
หรือpip list --local
เป็นคำตอบที่ดีที่สุดดูstackoverflow.com/a/43012269/491884โดย @MJB
ในเวอร์ชัน 1.3 ของ pip คุณสามารถใช้งานได้แล้ว pip list
มีตัวเลือกที่มีประโยชน์รวมถึงความสามารถในการแสดงแพ็คเกจที่ล้าสมัย นี่คือเอกสาร: https://pip.pypa.io/en/latest/reference/pip_list/
pip freeze
pip list --user
แสดงเฉพาะแพ็คเกจที่ติดตั้งโดยผู้ใช้และไม่รวมแพ็คเกจทั่วทั้งระบบ
หากใครสงสัยว่าคุณสามารถใช้คำสั่ง 'pip show'
pip show [options] <package>
จะแสดงรายการไดเรกทอรีการติดตั้งของแพ็คเกจที่กำหนด
ถ้า 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 package
error: No package owns $FILENAME
__init__.py
pacman -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'
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/"
เริ่มกับ:
$ 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
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 แต่พวกเขาทั้งหมดควรจะสามารถอัพเกรดโดย 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)
$
กำลังเพิ่มคำตอบของ @Paul Woolcock
pip freeze > requirements.txt
จะสร้างไฟล์ข้อกำหนดพร้อมกับแพ็คเกจที่ติดตั้งทั้งหมดพร้อมกับหมายเลขเวอร์ชันที่ติดตั้งในสภาพแวดล้อมการใช้งานที่ตำแหน่งปัจจุบัน วิ่ง
pip install -r requirements.txt
จะติดตั้งแพ็คเกจที่ระบุในไฟล์ข้อกำหนด
pip รุ่นใหม่กว่ามีความสามารถในการทำสิ่งที่ OP ต้องการผ่านpip list -l
หรือpip freeze -l
( --list
)
ใน Debian (อย่างน้อย) หน้าคนไม่ได้ทำให้ชัดเจนและฉันค้นพบมัน - ภายใต้ข้อสันนิษฐานว่าคุณลักษณะต้องมีอยู่ - ด้วยpip list --help
ภายใต้สมมติฐานว่าคุณสมบัติจะต้องมีอยู่ด้วย
มีความคิดเห็นล่าสุดที่แนะนำคุณสมบัตินี้ไม่ชัดเจนทั้งในเอกสารหรือคำตอบที่มีอยู่ (แม้ว่าบางคนจะได้รับคำแนะนำ) ดังนั้นฉันคิดว่าฉันควรโพสต์ ฉันอยากจะแสดงความคิดเห็น แต่ฉันไม่มีคะแนนชื่อเสียง
pip freeze --local
เวลา 8 ปี pip list --local
พร้อมใช้งานด้วย ... แต่สังเกตเห็นว่าคำถาม OP ไม่ได้เกี่ยวกับสภาพแวดล้อมเสมือนจริง (ซึ่ง--local
รองรับ) แต่เกี่ยวกับการแยกบรรจุภัณฑ์จากsudo pip install
แพ็คเกจ
พึงระลึกไว้ว่าหากคุณติดตั้ง Python หลายเวอร์ชันไว้ในคอมพิวเตอร์ของคุณคุณอาจมีจุดเล็ก ๆ น้อย ๆ ที่เชื่อมโยงกัน
คุณอาจต้องใช้ความระมัดระวังในการใช้คำสั่ง 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
ดังที่ @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
นี่คือสายการบินเดียวสำหรับ 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:'
รับชื่อไฟล์ / โฟลเดอร์ทั้งหมดในsite-packages/
(และdist-packages/
ถ้ามี) และใช้เครื่องมือจัดการแพ็คเกจเพื่อดึงไฟล์ที่ติดตั้งผ่านแพ็คเกจ
pip freeze จะแสดงรายการแพ็คเกจที่ติดตั้งทั้งหมดแม้ว่าจะไม่ได้ใช้ pip / easy_install บน CentOs / Redhat พบแพ็คเกจที่ติดตั้งผ่าน rpm
ถ้าคุณใช้งูกระจายหลามคุณสามารถใช้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
เพื่อหลีกเลี่ยงการต้องให้การยืนยันเพื่อลบ
สำหรับผู้ที่ไม่ได้ติดตั้ง pip ฉันพบสคริปต์สั้น ๆ นี้ในgithub (ใช้ได้กับ Python 2.7.13):
import pkg_resources
distros = pkg_resources.AvailableDistributions()
for key in distros:
print distros[key]
รายการ pip [ตัวเลือก] คุณสามารถดูข้อมูลอ้างอิงทั้งหมดได้ที่นี่
อย่างน้อยสำหรับ 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