จะแสดงรายการแพ็คเกจที่ติดตั้งและเวอร์ชันทั้งหมดใน Python ได้อย่างไร


128

มีวิธีใน Python เพื่อแสดงรายการแพ็คเกจที่ติดตั้งและเวอร์ชันทั้งหมดหรือไม่?

ฉันรู้ว่าฉันสามารถเข้าไปpython/Lib/site-packagesดูว่ามีไฟล์และไดเร็กทอรีอะไรอยู่บ้าง แต่ฉันพบว่ามันน่าอึดอัดมาก สิ่งที่ผมกำลังมองหาบางสิ่งบางอย่างที่คล้ายกับnpm listเช่นNPM-LS


คำตอบ:


196

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

pip freeze

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

ปรับปรุง

pip ได้รับการอัปเดตเพื่อสร้างเอาต์พุตเช่นเดียวกับการpip freezeเรียก:

pip list

บันทึก

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


9
IMHO พวกเขาควรจะให้เป็นชื่อแทนสำหรับpip list pip freezeที่ใช้งานง่ายที่จะเขียนแต่ไม่pip freeze > requirements.txt pip freeze
jsalonen

3
WOW: เพียงแค่มองเข้าไปในเอกสารของรุ่นล่าสุดของ pip และดูเหมือนว่าพวกเขาได้เพิ่มpip list: pip-installer.org/en/latest/usage.html#pip-list - ดังนั้นนี้เป็นจริงสิ่งที่กำลังจะมาถึงแล้ว!
jsalonen

51

help('modules') ควรทำเพื่อคุณ

ใน IPython:

In [1]: import                      #import press-TAB
Display all 631 possibilities? (y or n)
ANSI                   audiodev               markupbase
AptUrl                 audioop                markupsafe
ArgImagePlugin         avahi                  marshal
BaseHTTPServer         axi                    math
Bastion                base64                 md5
BdfFontFile            bdb                    mhlib
BmpImagePlugin         binascii               mimetools
BufrStubImagePlugin    binhex                 mimetypes
CDDB                   bisect                 mimify
CDROM                  bonobo                 mmap
CGIHTTPServer          brlapi                 mmkeys
Canvas                 bsddb                  modulefinder
CommandNotFound        butterfly              multifile
ConfigParser           bz2                    multiprocessing
ContainerIO            cPickle                musicbrainz2
Cookie                 cProfile               mutagen
Crypto                 cStringIO              mutex
CurImagePlugin         cairo                  mx
DLFCN                  calendar               netrc
DcxImagePlugin         cdrom                  new
Dialog                 cgi                    nis
DiscID                 cgitb                  nntplib
DistUpgrade            checkbox               ntpath

5
มีประโยชน์! ฉันชอบดูเวอร์ชั่นนี้ด้วย
jsalonen

4
ผมคิดว่าปัญหาคือเธอเอาใจใส่ไม่มีมาตรฐานวิธีการรวมทั้งรุ่น ... บางครั้งPackage.version()หรือpackage.__version__หรือpackage.verหรือหมายเลขใด ๆ ของความเป็นไปได้อื่น ๆ
Joran บีสลีย์

ฉันคิดว่าคำขวัญของงูเหลือมคือ "มีทางเดียวเท่านั้นที่จะทำได้";)?
Ed Randall

3
@EdRandall ไม่ - มันเป็น "วิธีหนึ่งที่ชัดเจนในการทำ" มีวิธีที่ชัดเจนเสมอ นอกจากนี้คำพูดที่ถูกต้องคือ: ควรมีเพียงวิธีเดียวและควรมีเพียงวิธีเดียวเท่านั้นที่จะทำได้ แม้ว่าวิธีดังกล่าวอาจไม่ชัดเจนในตอนแรกเว้นแต่คุณเป็นชาวดัตช์
rosuav

30

หากคุณต้องการรับข้อมูลเกี่ยวกับการแจกแจง python ที่คุณติดตั้งและไม่ต้องการใช้คอนโซลหรือเทอร์มินัล cmd ของคุณ แต่ใช้รหัส python คุณสามารถใช้รหัสต่อไปนี้ (ทดสอบด้วย python 3.4):

import pip #needed to use the pip functions
for i in pip.get_installed_distributions(local_only=True):
    print(i)

pip.get_installed_distributions(local_only=True)ฟังก์ชั่นการโทรกลับ iterable และเพราะสำหรับวงและฟังก์ชั่นการพิมพ์องค์ประกอบที่มีอยู่ใน iterable จะพิมพ์ออกมาคั่นด้วยตัวอักษรบรรทัดใหม่ ( \n) ผลลัพธ์จะ (ขึ้นอยู่กับการแจกแจงที่คุณติดตั้ง) มีลักษณะดังนี้:

cycler 0.9.0
decorator 4.0.4
ipykernel 4.1.0
ipython 4.0.0
ipython-genutils 0.1.0
ipywidgets 4.0.3
Jinja2 2.8
jsonschema 2.5.1
jupyter 1.0.0
jupyter-client 4.1.1
#... and so on...

4
หากต้องการขยายความคิดเห็นของ @ exhuma ด้วย pip 10 คุณควรใช้: นำเข้า pkg_resources [พิมพ์ (d.project_name) สำหรับ d ใน pkg_resources.working_set]
Almenon

สถานะของpkg_resourcesอะไร? AFAICR setuptoolsนี้เป็นส่วนหนึ่งของ pipไม่ เราสามารถสรุปได้อย่างปลอดภัยว่าsetuptoolsจะสามารถใช้ได้เสมอขึ้นอยู่กับpip?
exhuma

9

คุณสามารถลอง: ไข่แดง

สำหรับการติดตั้งไข่แดงให้ลอง:

easy_install yolk

Yolk เป็นเครื่องมือ Python สำหรับรับข้อมูลเกี่ยวกับแพ็คเกจ Python ที่ติดตั้งและแพ็คเกจการสืบค้นที่มีอยู่ใน PyPI (Python Package Index)

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


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

1
ไม่รองรับ python 3 (เพิ่งติดตั้งจาก pip และมีข้อผิดพลาดรันไทม์)
Ohad Cohen

9

หากต้องการเรียกใช้สิ่งนี้ใน pip เวอร์ชันที่ใหม่กว่า (ทดสอบบนpip==10.0.1) ให้ใช้สิ่งต่อไปนี้:

from pip._internal.operations.freeze import freeze
for requirement in freeze(local_only=True):
    print(requirement)

สถานะภายในpydoc pip._internalhelp(pip._internal)คืออะไร. ฉันเห็นแต่ฉันไม่สามารถเข้าถึงได้ใต้pip .__ builtins_ etc. คู่มืออ้างอิง pip ว่างเปล่าเช่นกัน
MortenB

1
น่าเสียดายที่ฉันไม่รู้ ไม่ชอบให้เรียก_internalเหมือนกัน ดูเหมือนว่าฟังก์ชันการทำงานจะไม่ถูกเปิดเผยอย่างเป็นทางการ ดังนั้นคุณควรจัดการด้วยความระมัดระวัง!
exhuma

8

จากบรรทัดคำสั่ง

python -c help('modules')

สามารถใช้เพื่อดูโมดูลทั้งหมดและสำหรับโมดูลเฉพาะ

python -c help('os')

สำหรับ Linux ด้านล่างจะใช้งานได้

python -c "help('os')"

5
สิ่งนี้ใช้ได้กับ windows บน linux มันแสดงข้อผิดพลาด:-bash: syntax error near unexpected token `('
AjayKumarBasuthkar

สิ่งนี้ไม่ให้เวอร์ชันโมดูล
Stepan Yakovenko

5

ใช่! คุณควรใช้ pip เป็นตัวจัดการแพ็คเกจ python ของคุณ ( http://pypi.python.org/pypi/pip )

ด้วยแพ็คเกจที่ติดตั้ง pip คุณสามารถทำไฟล์

pip freeze

และจะแสดงรายการแพ็คเกจที่ติดตั้งทั้งหมด คุณควรจะใช้VirtualenvและVirtualenvwrapper virtualenvwrapperเมื่อคุณเริ่มโครงการใหม่คุณสามารถทำได้

mkvirtualenv my_new_project

จากนั้น (ภายใน Virtualenv นั้น) ทำ

pip install all_your_stuff

วิธีนี้คุณสามารถทำได้ workon my_new_projectแล้วpip freezeเพื่อดูว่ามีการติดตั้งแพคเกจสำหรับการที่ virtualenv / โครงการ

ตัวอย่างเช่น:

  ~  mkvirtualenv yo_dude
New python executable in yo_dude/bin/python
Installing setuptools............done.
Installing pip...............done.
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/predeactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/postdeactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/preactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/postactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/get_env_details

(yo_dude)➜  ~  pip install django
Downloading/unpacking django
  Downloading Django-1.4.1.tar.gz (7.7Mb): 7.7Mb downloaded
  Running setup.py egg_info for package django

Installing collected packages: django
  Running setup.py install for django
    changing mode of build/scripts-2.7/django-admin.py from 644 to 755

    changing mode of /Users/aaylward/dev/virtualenvs/yo_dude/bin/django-admin.py to 755
Successfully installed django
Cleaning up...

(yo_dude)➜  ~  pip freeze
Django==1.4.1
wsgiref==0.1.2

(yo_dude)➜  ~  

หรือถ้าคุณมีแพ็คเกจ python ที่มีไฟล์ requirements.pip

mkvirtualenv my_awesome_project
pip install -r requirements.pip
pip freeze

จะทำเคล็ดลับ


ใช่ฉันใช้ Virtualenv มาระยะหนึ่งแล้ว ฉันไม่รู้ว่าฉันคิดไม่ออกว่าฉันจะใช้pipมันด้วยวิธีนี้ได้อย่างไร!
jsalonen

เกี่ยวกับแพคเกจเว็บไซต์ทั่วโลกแล้วคุณจำเป็นต้องใช้virtualenv pip list --local
Ioannis Filippidis

@johntex คุณไม่ควรใช้แพ็คเกจไซต์ทั่วโลก!
Andbdrew

การใช้แพ็คเกจไซต์ทั่วโลกมีประโยชน์มาก หากไม่เป็นเช่นนั้นตัวเลือกจะไม่มีอยู่เลยในvirtualenv. ฉันไม่ทราบเหตุผลใด ๆ ที่ไม่ใช้มันและไม่มีใครป้องกันไม่ให้คุณ จำกัด การแยกตัวออกไปvirtualenvหากคุณต้องการ
Ioannis Filippidis

เหตุผลที่ดีอย่างหนึ่งที่จะไม่ใช้ก็คือเมื่อคุณแจกจ่ายหรือปรับใช้แอปหรือโปรแกรมของคุณบุคคล / เซิร์ฟเวอร์อื่น ๆ จะไม่มีแพ็คเกจไซต์ส่วนกลางของคุณ หากคุณเป็นคนเดียวที่ใช้แอปนี้ให้ทำสิ่งที่คุณต้องการ
Andbdrew

5

ใช้เวลาของฉัน:

#!/usr/bin/env python3

import pkg_resources

dists = [str(d).replace(" ","==") for d in pkg_resources.working_set]
for i in dists:
    print(i)

2

ต่อไปนี้เป็นวิธีที่ทำได้โดยใช้PYTHONPATHแทนพา ธ สัมบูรณ์ของ python libs dir ของคุณ:

for d in `echo "${PYTHONPATH}" | tr ':' '\n'`; do ls "${d}"; done

[ 10:43 Jonathan@MacBookPro-2 ~/xCode/Projects/Python for iOS/trunk/Python for iOS/Python for iOS ]$ for d in `echo "$PYTHONPATH" | tr ':' '\n'`; do ls "${d}"; done
libpython2.7.dylib pkgconfig          python2.7
BaseHTTPServer.py      _pyio.pyc              cgitb.pyo              doctest.pyo            htmlentitydefs.pyc     mimetools.pyc          plat-mac               runpy.py               stringold.pyc          traceback.pyo
BaseHTTPServer.pyc     _pyio.pyo              chunk.py               dumbdbm.py             htmlentitydefs.pyo     mimetools.pyo          platform.py            runpy.pyc              stringold.pyo          tty.py
BaseHTTPServer.pyo     _strptime.py           chunk.pyc              dumbdbm.pyc            htmllib.py             mimetypes.py           platform.pyc           runpy.pyo              stringprep.py          tty.pyc
Bastion.py             _strptime.pyc          chunk.pyo              dumbdbm.pyo            htmllib.pyc            mimetypes.pyc          platform.pyo           sched.py               stringprep.pyc         tty.pyo
Bastion.pyc            _strptime.pyo          cmd.py
....


1

หากจำเป็นต้องเรียกใช้จากภายใน python คุณสามารถเรียกใช้กระบวนการย่อยได้

from subprocess import PIPE, Popen

pip_process = Popen(["pip freeze"], stdout=PIPE,
                   stderr=PIPE, shell=True)
stdout, stderr = pip_process.communicate()
print(stdout.decode("utf-8"))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.