ฉันจะรับรายการโมดูล Python ที่ติดตั้งภายในเครื่องได้อย่างไร


997

ฉันต้องการรับรายการโมดูล Python ซึ่งอยู่ในการติดตั้ง Python ของฉัน (เซิร์ฟเวอร์ UNIX)

คุณจะรับรายการโมดูล Python ที่ติดตั้งในคอมพิวเตอร์ได้อย่างไร


77
คุณสามารถทำ >>> help () จากนั้น >>> modules
Julius Naeumann

1
มีทางเลือกอื่นหรือไม่? ช่วย () แฮงค์ให้ฉัน
Paulo Carvalho

2
คำตอบมากมายเหล่านี้ถือว่าคุณสามารถเข้าถึงบรรทัดคำสั่งได้ หากคุณใช้ AWS Lambda คุณต้องทำทั้งหมดจากภายใน Python ดูstackoverflow.com/a/54939905/117471
Bruno Bronosky

คำตอบ:


610

สารละลาย

ห้ามใช้กับ pip> 10.0!

50 เซ็นต์ของฉันสำหรับการรับpip freezeรายการเหมือนจากสคริปต์ Python:

import pip
installed_packages = pip.get_installed_distributions()
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
     for i in installed_packages])
print(installed_packages_list)

ในฐานะหนึ่งซับ (ยาวเกินไป) หนึ่งซับ:

sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])

ให้:

['behave==1.2.4', 'enum34==1.0', 'flask==0.10.1', 'itsdangerous==0.24', 
 'jinja2==2.7.2', 'jsonschema==2.3.0', 'markupsafe==0.23', 'nose==1.3.3', 
 'parse-type==0.3.4', 'parse==1.6.4', 'prettytable==0.7.2', 'requests==2.3.0',
 'six==1.6.1', 'vioozer-metadata==0.1', 'vioozer-users-server==0.1', 
 'werkzeug==0.9.4']

ขอบเขต

การแก้ปัญหานี้นำไปใช้กับขอบเขตระบบหรือขอบเขตสภาพแวดล้อมเสมือนจริงและแพคเกจติดตั้งโดยครอบคลุมsetuptools, pipและ ( พระเจ้าห้ามeasy_install )

กรณีใช้ของฉัน

ฉันเพิ่มผลลัพธ์ของการโทรนี้ไปยังเซิร์ฟเวอร์ขวดของฉันดังนั้นเมื่อฉันเรียกมันด้วยhttp://example.com/exampleServer/environmentฉันจะได้รับรายการแพ็คเกจที่ติดตั้งบน virtualenv ของเซิร์ฟเวอร์ ทำให้การดีบักง่ายขึ้นมาก

คำเตือน

ฉันได้สังเกตเห็นพฤติกรรมแปลก ๆ ของเทคนิคนี้ - เมื่อล่ามหลามถูกเรียกในไดเรกทอรีเดียวกันเป็นไฟล์ก็ไม่ได้แสดงรายการแพคเกจติดตั้งโดยsetup.pysetup.py

ขั้นตอนในการทำซ้ำ:

สร้างสภาพแวดล้อมเสมือนจริง
$ cd /tmp
$ virtualenv test_env
New python executable in test_env/bin/python
Installing setuptools, pip...done.
$ source test_env/bin/activate
(test_env) $ 
โคลน repo คอมไพล์ด้วย setup.py
(test_env) $ git clone https://github.com/behave/behave.git
Cloning into 'behave'...
remote: Reusing existing pack: 4350, done.
remote: Total 4350 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (4350/4350), 1.85 MiB | 418.00 KiB/s, done.
Resolving deltas: 100% (2388/2388), done.
Checking connectivity... done.

เรามีพฤติกรรมsetup.pyใน/tmp/behave:

(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
ติดตั้งแพ็กเกจหลามจาก repo git
(test_env) $ cd /tmp/behave && pip install . 
running install
...
Installed /private/tmp/test_env/lib/python2.7/site-packages/enum34-1.0-py2.7.egg
Finished processing dependencies for behave==1.2.5a1

หากเราเรียกใช้โซลูชันดังกล่าวจาก /tmp

>>> import pip
>>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
['behave==1.2.5a1', 'enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']
>>> import os
>>> os.getcwd()
'/private/tmp'

หากเราเรียกใช้โซลูชันดังกล่าวจาก /tmp/behave

>>> import pip
>>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
['enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']
>>> import os
>>> os.getcwd()
'/private/tmp/behave'

behave==1.2.5a1หายไปจากตัวอย่างที่สองเพราะไดเรกทอรีการทำงานมีbehave's setup.pyไฟล์

ฉันไม่พบการอ้างอิงถึงปัญหานี้ในเอกสารประกอบ บางทีฉันจะเปิดข้อบกพร่องสำหรับมัน


5
ขอบคุณสำหรับคำตอบนี้! ฉันคิดว่ามันจะตอบคำถามได้ดีกว่าเพราะฉันขอให้ติดตั้งโมดูล Python "ในพื้นที่" การตรึง Pip ยังไม่ใช่วิธีที่จะไปเสมอ มันใช้งานได้ดีกว่า - ฉันคิดว่า
LéoLéopold Hertz

3
@Masi เพิ่งเพิ่มคำอธิบายโดยละเอียดเกี่ยวกับคำเตือนของโซลูชันนี้ มันเป็นสิ่งที่แปลกจริงๆ
Adam Matan

21
ทางเลือก:import pkg_resources; installed_packages = [(d.project_name, d.version) for d in pkg_resources.working_set]
59

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

5
ในรุ่นล่าสุดของ pip AttributeError: module 'pip' has no attribute 'get_installed_distributions'นี้จะไม่ทำงานให้ผลผลิตข้อความผิดพลาดว่า
HelloGoodbye

1038
help('modules')

ใน Python เชลล์ / พรอมต์


10
@dF ใช้pydoc modulesงานได้ คุณควรส่งมันเป็นคำตอบ
Abizern

37
ทำให้ฉันมีความผิด seg!
zanbri

3
nobar, zanbri, @Joe Frambach: บน Ubuntu หรือ มีข้อบกพร่องที่อธิบายไว้ที่นี่: bugs.launchpad.net/ubuntu/+source/python2.7/+bug/896836
ChristopheD

2
ฉันจะรับข้อมูลเพิ่มเติมเกี่ยวกับที่ติดตั้งโมดูลและรุ่นปัจจุบันได้อย่างไร
อยากรู้อยากเห็น

5
python -c 'help("modules")'
kenorb

285

ตอนนี้วิธีการเหล่านี้ฉันลองด้วยตัวเองและฉันได้รับสิ่งที่โฆษณา: โมดูลทั้งหมด

อนิจจาจริงๆคุณไม่สนใจ stdlib มากนักคุณรู้ว่าคุณจะได้อะไรจากการติดตั้ง python

จริง ๆ แล้วฉันต้องการสิ่งที่ฉันติดตั้ง

สิ่งที่น่าประหลาดใจจริงๆก็คือการทำงานได้ดีคือ:

pip freeze

ซึ่งส่งคืน:

Fabric==0.9.3
apache-libcloud==0.4.0
bzr==2.3b4
distribute==0.6.14
docutils==0.7
greenlet==0.3.1
ipython==0.10.1
iterpipes==0.4
libxml2-python==2.6.21

ฉันพูดว่า "น่าประหลาดใจ" เพราะเครื่องมือติดตั้งแพคเกจเป็นที่แน่นอนที่ใคร ๆ ก็คาดหวังว่าจะได้พบกับฟังก์ชั่นนี้แม้ว่าจะไม่ได้อยู่ภายใต้ชื่อ 'หยุด' แต่บรรจุภัณฑ์หลามนั้นแปลกมาก Pip 0.8.2, Python 2.7


4
ฉันเดาว่าความคิดเบื้องหลังชื่อนี้คือคุณได้ภาพสแนปช็อตที่ "ติด" อยู่ในตอนนี้ซึ่งคุณสามารถป้อนกลับเข้าไปใน pip เพื่อรับโมดูลเดียวกันที่ติดตั้งในสภาพแวดล้อมที่แตกต่างกัน
Ryan C. Thompson

อีกประการหนึ่ง, คุณสามารถติดตั้ง pip ใน Windows ได้เช่นกัน! ขั้นแรกให้ติดตั้ง setuptools จากนั้นใช้ easy_install เพื่อติดตั้ง pip :)
gawbul

สิ่งนี้ยอดเยี่ยม แต่ดูเหมือนจะพลาดบางไลบรารีที่ฉันติดตั้ง ตัวอย่างเช่นจะไม่แสดงรายการ PyQt
Junuxx

8
เริ่มต้นจาก pip 1.3 มีคำสั่งlist
Piotr Dobrogost

มันได้ผล. หลามเลอะเป็นอะไร ทำไมพวกเขาถึงไม่ทำหน้าที่ร่วมกันและคิดหาวิธีแก้ไขที่คล้ายกับสิ่งที่มีอยู่ใน Rails? (Gemfile, bundler, rvm)
Dimitris

106

ตั้งแต่ pip เวอร์ชั่น 1.3 คุณสามารถเข้าถึง:

pip list

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


4
นอกจากนี้ยังมีpip list --localสำหรับความแตกต่างระหว่างvirtualenvและเว็บไซต์ทั่วโลกแพคเกจกล่าวถึงที่นี่
Ioannis Filippidis

1
โดยที่ดีที่สุด นอกจากนี้ยังเรียกคืนรุ่น
aerijman

pip listเป็นสิ่งที่ง่ายและดีที่สุด นี่คือตัวเลือกและรายละเอียด
Levi Baguley

86
  • ในipythonคุณสามารถพิมพ์ " importTab"

  • ในตัวแปล Python มาตรฐานคุณสามารถพิมพ์ " help('modules')"

  • ในบรรทัดคำสั่งที่คุณสามารถใช้pydoc modules

  • pkgutil.iter_modules()ในสคริปต์โทร


5
pkgutil.iter_modules()ใช้งานได้โซลูชัน pip ดังกล่าวไม่ได้แสดงรายการแพ็คเกจทั้งหมดเพียงรายการที่ติดตั้งผ่าน pip
metaperture

2
! น่ากลัว ฉันคิดว่าพวกเขามีเอกสารที่ดีขึ้นเนื่องจากคำถามถูกถาม โมดูล pydoc สแปมค้นหาสแปมในเอกสารของโมดูล จุดสุดท้ายดูเหมือนจะให้ข้อมูลที่เพียงพอต่อการใช้โมดูล @metaperture คุณสามารถโปรดให้ตัวอย่างวิธีการที่คุณแสดงรายการโมดูลท้องถิ่นทั้งหมดที่ติดตั้ง (ไม่ใช่รายการใหญ่ของ stlib โดยความช่วยเหลือ ( 'โมดูล')) โดยpkgutil.iter_modules ()
LéoLéopold Hertz 준영

2
@ LéoLéopoldHertz준영ลองตัวอย่างนี้: python -c 'import pkgutil;print [x[1] for x in list(pkgutil.iter_modules())]'. ควรทิ้งชื่อโมดูลทั้งหมดเป็นรายการ Python ที่มีขนาดใหญ่จริงๆ x[1]บิตจะใช้ในการถอนออกชื่อโมดูลของ tuples pkgutil.iter_modules()ที่สร้างขึ้นโดย
Philip Conrad

76

ฉันแค่ใช้สิ่งนี้เพื่อดูโมดูลที่ใช้อยู่ในปัจจุบัน:

import sys as s
s.modules.keys()

ซึ่งจะแสดงโมดูลทั้งหมดที่ทำงานบนหลามของคุณ

สำหรับโมดูลในตัวทั้งหมดใช้:

s.modules

ซึ่งเป็น dict ที่มีโมดูลทั้งหมดและนำเข้าวัตถุ


2
# หลังจากที่คุณนำเข้า sys "import sys as s" คุณสามารถพิมพ์ด้วย: print sys.modules.keys ()
Dan Evans

ไม่แน่ใจว่าทำไมโพสต์ของฉันถูกแก้ไข แต่ขอบคุณที่ใช้ข้อมูลที่โพสต์เพื่อแก้ไขข้อผิดพลาดในโพสต์ก่อนหน้า คุณจะส่งคืนข้อผิดพลาดหากคุณใช้ help () vs help ('') สิ่งนี้มีไว้สำหรับ dir ('') & sys ('') ฯลฯ เช่นกัน หวังว่านี่จะช่วย & ไม่ได้ถูกลบออก
Dan Evans

ละเว้นโพสต์ล่าสุดของฉันโพสต์นี้ไม่ได้ถูกแก้ไข ฉันคิดถึงโพสต์ที่คล้ายกันที่นี่: stackoverflow.com/questions/139180/…ขออภัยในความสับสน
Dan Evans

7
upvoted เพราะนี่เป็นวิธีเดียวที่ดูเหมือนว่าจะทำงานบนระบบ จำกัด ที่มีค่าpydocมิได้pipติดตั้ง (ก NAS ในกรณีของฉัน)
โทมัส

1
เห็นด้วยกับโทมัส ฉันกำลังใช้ repl.it เช่นซึ่งเป็นประเภทของสภาพแวดล้อมที่มีข้อ จำกัด help('modules')แค่แฮงค์โดยไม่มีการตอบสนองสำหรับฉัน แต่วิธีการนี้มีsysผลงานสมบูรณ์แบบ
Sergiy Kolodyazhnyy

63

ในเปลือกปกติเพียงใช้

pydoc modules

ดูเหมือนว่าข้างต้นใช้งานได้บนแพลตฟอร์ม 'ระวัง' เท่านั้น ไม่ว่าในกรณีใดฉันพบและเรียกใช้สคริปต์โดยปรับคำสั่งดังนี้ c: \ bin \ pythos_2.7 \ lib \ pydoc.py โมดูล - รายการนั้นใช้เวลานานในการสร้างรูปแบบ sucks และไม่ใช้รุ่นที่ติดตั้ง จำนวน. ฉันจะผ่าน
David A. Gray

2
@ DavidA.Gray ลองใช้กับเครื่อง Windows ด้วย Python 3 และใช้งานได้จริง การใช้ตัวเรียกใช้งาน python windows คุณสามารถทำได้py -m pydoc modulesใน cmd หรือ Powershell
VKK

pydoc modulesไม่ทำงานสำหรับฉันใน Windows 10 ที่มี Python 3.6 แต่การแก้ไข @VKK: py -m pydoc modulesทำงานใน cmd / Powershell
มาร์ติน

41

ตั้งแต่ pip 10 คำตอบที่ยอมรับจะไม่ทำงานอีกต่อไป ทีมพัฒนาได้ลบการเข้าถึงget_installed_distributionsรูทีน มีฟังก์ชั่นสำรองในการsetuptoolsทำสิ่งเดียวกัน นี่คือเวอร์ชั่นสำรองที่ใช้งานได้กับ pip 10:

import pkg_resources
installed_packages = pkg_resources.working_set
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
     for i in installed_packages])
print(installed_packages_list)

โปรดแจ้งให้เราทราบว่าจะใช้หรือไม่ทำงานใน pip รุ่นก่อนหน้าเช่นกัน


2
ฉันค้นหาวิธีแก้ปัญหานี้และพยายามทำให้สมองของฉันพยายามหา pkg_resources ถ้าฉันสามารถลงคะแนนมากกว่านี้ฉันจะ ขอบคุณ @Big_Al_Tx! อัปเดต: ยกเว้น ... เมื่อฉันทำ 'หยุดการตรึง' ในสภาพแวดล้อมเสมือนจริงของฉันและเปรียบเทียบกับผลลัพธ์ของสิ่งนี้มีแพ็คเกจที่ขาดหายไป มีความคิดเห็นเกี่ยวกับสาเหตุที่อาจเกิดขึ้นหรือไม่?
numberwhun

@numberwhun - ฉันดีใจที่มันเหมาะกับคุณ ฉันขอโทษ แต่ฉันไม่มีคำตอบสำหรับความคลาดเคลื่อนด้วยpip freeze; ความรู้เชิงลึกของฉันในหัวข้อนี้ค่อนข้าง จำกัด ฉันคลำหาวิธีแก้ปัญหาเมื่อคำตอบที่ยอมรับไม่ได้ผลสำหรับฉันและฉันพยายามรวมกับคำตอบที่เกี่ยวข้องsetuptoolsและนำไปใช้งานได้
Big_Al_Tx

github.com/pypa/pip/issues/5243 - get_installed_distributions routineพูดคุยของทีมพัฒนาเกี่ยวกับการเข้าถึงที่ถูกลบออกไป
bl79

@ bl79 - setuptoolsผมคิดว่าเป็นสถานที่ที่แน่นอนที่ผมได้รับการอ้างอิงสำหรับ
Big_Al_Tx

@Big_Al_Tx: ดีฉันเรียงลำดับของการทำงานรอบตัวเลือก setuptools (ซึ่ง waaaay เพื่อ obfuscated สำหรับความต้องการของฉัน) และฉันไปกับมัน: installed_pkgs = subprocess.check_output (['pip', 'freeze']) จำเป็นต้องใช้เพื่อทำ .... Yay !!
numberwhun

26

หากเราต้องการแสดงรายการแพ็คเกจที่ติดตั้งไว้ใน Python shell เราสามารถใช้helpคำสั่งดังต่อไปนี้

>>help('modules package')

22

ปกติฉันจะใช้pip listเพื่อรับรายการแพ็คเกจ (พร้อมรุ่น)

ใช้งานได้ในสภาพแวดล้อมเสมือนจริงเช่นกัน เพื่อแสดงให้เห็นว่ามีการติดตั้งเฉพาะในสภาพแวดล้อมเสมือนจริง (ไม่ได้แพคเกจทั่วโลก), pip list --localการใช้งาน

นี่คือเอกสารที่แสดงpip listตัวเลือกที่มีทั้งหมดพร้อมตัวอย่างที่ดีหลายอย่าง


13

ค้นหาง่ายมากโดยใช้pkgutil.iter_modules

from pkgutil import iter_modules
a=iter_modules()
while True:
    try: x=a.next()
    except: break
    if 'searchstr' in x[1]: print x[1]

มีเหตุผลที่จะใช้ในขณะที่แทนที่จะเป็น for loop หรือไม่? ฉันเขียนโดยใช้for m in iter_modules()และมันก็ใช้ได้ดีเช่นกัน
Joao Ponte

13

บน windows ป้อนสิ่งนี้เป็นคำสั่ง

c:\python\libs>python -m pip freeze

สิ่งนี้ใช้ได้กับฉันโดยใช้: python3 -m pip freeze - สำหรับ python 3.5.3
dpminusa

วิธีนี้ใช้งานได้ดีและคุณไม่จำเป็นต้องอยู่ในไดเรกทอรี libs เช่นกันหากตัวแปรของคุณถูกกำหนด
mcy

12

ฉันวิ่งเข้าไปใน python 2.7 ที่ติดตั้งแบบกำหนดเองบน OS X ต้องใช้ X11 เพื่อแสดงรายการโมดูลที่ติดตั้ง (ทั้งสองใช้ความช่วยเหลือและ pydoc)

เพื่อให้สามารถแสดงรายการโมดูลทั้งหมดโดยไม่ต้องติดตั้ง X11 ฉันรัน pydoc เป็น http-server เช่น

pydoc -p 12345

จากนั้นจึงเป็นไปได้ที่จะให้ Safari ไปhttp://localhost:12345/ยังโมดูลทั้งหมด



12

สิ่งนี้จะช่วยได้

ในเทอร์มินัลหรือ IPython ให้พิมพ์:

help('modules')

แล้วก็

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

นี่ควรเป็นคำตอบที่ยอมรับได้! หนึ่งบรรทัด :)
เกือบพิตต์

9

วิธีการแก้ปัญหานี้มีพื้นฐานมาจากโมดูลimportlibและpkgutilและทำงานกับ CPython 3.4 และ CPython 3.5 แต่ไม่รองรับ CPython 2


คำอธิบาย

  1. sys.builtin_module_names- ชื่อโมดูลในตัวทั้งหมด (ดูคำตอบของฉันที่นี่ )
  2. pkgutil.iter_modules() - ส่งคืนข้อมูลเกี่ยวกับโมดูลที่มีอยู่ทั้งหมด
  3. importlib.util.find_spec() - ส่งคืนข้อมูลเกี่ยวกับการนำเข้าโมดูลหากมีอยู่
  4. BuiltinImporter- ผู้นำเข้าสำหรับโมดูลในตัว ( เอกสาร )
  5. SourceFileLoader- ผู้นำเข้าสำหรับโมดูล Python มาตรฐาน (โดยค่าเริ่มต้นมีส่วนขยาย * .py) ( เอกสาร )
  6. ExtensionFileLoader- ผู้นำเข้าสำหรับโมดูลเป็นไลบรารีที่แชร์ (เขียนบน C หรือ C ++)

รหัสเต็ม

import sys
import os
import shutil
import pkgutil
import importlib
import collections

if sys.version_info.major == 2:
    raise NotImplementedError('CPython 2 is not supported yet')


def main():

    # name this file (module)
    this_module_name = os.path.basename(__file__).rsplit('.')[0]

    # dict for loaders with their modules
    loaders = collections.OrderedDict()

    # names`s of build-in modules
    for module_name in sys.builtin_module_names:

        # find an information about a module by name
        module = importlib.util.find_spec(module_name)

        # add a key about a loader in the dict, if not exists yet
        if module.loader not in loaders:
            loaders[module.loader] = []

        # add a name and a location about imported module in the dict
        loaders[module.loader].append((module.name, module.origin))

    # all available non-build-in modules
    for module_name in pkgutil.iter_modules():

        # ignore this module
        if this_module_name == module_name[1]:
            continue

        # find an information about a module by name
        module = importlib.util.find_spec(module_name[1])

        # add a key about a loader in the dict, if not exists yet
        loader = type(module.loader)
        if loader not in loaders:
            loaders[loader] = []

        # add a name and a location about imported module in the dict
        loaders[loader].append((module.name, module.origin))

    # pretty print
    line = '-' * shutil.get_terminal_size().columns
    for loader, modules in loaders.items():
        print('{0}\n{1}: {2}\n{0}'.format(line, len(modules), loader))
        for module in modules:
            print('{0:30} | {1}'.format(module[0], module[1]))


if __name__ == '__main__':
    main()

การใช้

สำหรับ CPython3.5 (ตัดปลาย)

$ python3.5 python_modules_info.py 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
30: <class '_frozen_importlib.BuiltinImporter'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_ast                           | built-in
_codecs                        | built-in
_collections                   | built-in
_functools                     | built-in
_imp                           | None
_io                            | built-in
_locale                        | built-in
_operator                      | built-in
_signal                        | built-in
_sre                           | built-in
_stat                          | built-in
_string                        | built-in
_symtable                      | built-in
_thread                        | built-in
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
227: <class '_frozen_importlib_external.SourceFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__future__                     | /usr/local/lib/python3.5/__future__.py
_bootlocale                    | /usr/local/lib/python3.5/_bootlocale.py
_collections_abc               | /usr/local/lib/python3.5/_collections_abc.py
_compat_pickle                 | /usr/local/lib/python3.5/_compat_pickle.py
_compression                   | /usr/local/lib/python3.5/_compression.py
_dummy_thread                  | /usr/local/lib/python3.5/_dummy_thread.py
_markupbase                    | /usr/local/lib/python3.5/_markupbase.py
_osx_support                   | /usr/local/lib/python3.5/_osx_support.py
_pydecimal                     | /usr/local/lib/python3.5/_pydecimal.py
_pyio                          | /usr/local/lib/python3.5/_pyio.py
_sitebuiltins                  | /usr/local/lib/python3.5/_sitebuiltins.py
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
64: <class '_frozen_importlib_external.ExtensionFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_bisect                        | /usr/local/lib/python3.5/lib-dynload/_bisect.cpython-35m-x86_64-linux-gnu.so
_bz2                           | /usr/local/lib/python3.5/lib-dynload/_bz2.cpython-35m-x86_64-linux-gnu.so
_codecs_cn                     | /usr/local/lib/python3.5/lib-dynload/_codecs_cn.cpython-35m-x86_64-linux-gnu.so
_codecs_hk                     | /usr/local/lib/python3.5/lib-dynload/_codecs_hk.cpython-35m-x86_64-linux-gnu.so
_codecs_iso2022                | /usr/local/lib/python3.5/lib-dynload/_codecs_iso2022.cpython-35m-x86_64-linux-gnu.so
(****************************truncated*******************************)

สำหรับ CPython3.4 (ตัดปลาย)

$ python3.4 python_modules_info.py
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
54: <class '_frozen_importlib.BuiltinImporter'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_ast                           | built-in
_bisect                        | built-in
_codecs                        | built-in
_collections                   | built-in
_datetime                      | built-in
_elementtree                   | built-in
_functools                     | built-in
_heapq                         | built-in
_imp                           | None
_io                            | built-in
_locale                        | built-in
_md5                           | built-in
_operator                      | built-in
_pickle                        | built-in
_posixsubprocess               | built-in
_random                        | built-in
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
246: <class '_frozen_importlib.SourceFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__future__                     | /usr/lib/python3.4/__future__.py
_bootlocale                    | /usr/lib/python3.4/_bootlocale.py
_collections_abc               | /usr/lib/python3.4/_collections_abc.py
_compat_pickle                 | /usr/lib/python3.4/_compat_pickle.py
_dummy_thread                  | /usr/lib/python3.4/_dummy_thread.py
_markupbase                    | /usr/lib/python3.4/_markupbase.py
_osx_support                   | /usr/lib/python3.4/_osx_support.py
_pyio                          | /usr/lib/python3.4/_pyio.py
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
44: <class '_frozen_importlib.ExtensionFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_bz2                           | /usr/lib/python3.4/lib-dynload/_bz2.cpython-34m-x86_64-linux-gnu.so
_codecs_cn                     | /usr/lib/python3.4/lib-dynload/_codecs_cn.cpython-34m-x86_64-linux-gnu.so
_codecs_hk                     | /usr/lib/python3.4/lib-dynload/_codecs_hk.cpython-34m-x86_64-linux-gnu.so
_codecs_iso2022                | /usr/lib/python3.4/lib-dynload/_codecs_iso2022.cpython-34m-x86_64-linux-gnu.so
_codecs_jp                     | /usr/lib/python3.4/lib-dynload/_codecs_jp.cpython-34m-x86_64-linux-gnu.so
_codecs_kr                     | /usr/lib/python3.4/lib-dynload/_codecs_kr.cpython-34m-x86_64-linux-gnu.so
_codecs_tw                     | /usr/lib/python3.4/lib-dynload/_codecs_tw.cpython-34m-x86_64-linux-gnu.so
_crypt                         | /usr/lib/python3.4/lib-dynload/_crypt.cpython-34m-x86_64-linux-gnu.so
(****************************truncated*******************************)

คุณช่วยเปรียบเทียบวิธีการของคุณกับแนวทางของอดัมได้ที่นี่stackoverflow.com/a/23885252/54964
LéoLéopold Hertz 준영

@ LéoLéopold Hertz ทำไมคุณถึงต้องการมัน
PADYMKO

เพื่อให้เข้าใจว่าวิธีการของคุณดีกว่าหรือแย่กว่าวิธีของอดัม
LéoLéopold Hertz 준영

1
@ LéoLéopold Hertz คำตอบสั้น ๆ : ลองด้วยตัวเองในการผลิตและวาดข้อสรุปด้วยตัวเอง คำตอบยาว: วิธีการของอดัมขึ้นอยู่กับpip- ระบบการจัดการแพ็กเกจที่ใช้ในการติดตั้งและจัดการซอฟต์แวร์แพ็กเกจที่เขียนด้วย Python และผลลัพธ์pip.get_installed_distributions()จะส่งคืนโมดูลที่ติดตั้งพร้อมกับ pip คำตอบของฉันขึ้นอยู่กับห้องสมุดมาตรฐานของ Python และครอบคลุมโมดูลทั้งหมดที่มีเพื่อนำเข้า ข้อเสียเปรียบที่ใหญ่ที่สุดคำตอบของฉัน - ไม่รองรับ CPython 2
PADYMKO

1
@ LéoLéopold Hertz คุณเข้าใจผิดมันเป็นเช่นนั้น ฉันทดสอบในคอมพิวเตอร์ของฉัน คำตอบของฉันมีความหมายพิเศษ**truncated**ที่ผลลัพธ์ถูกตัดทอน บางทีคุณอาจไม่ระวัง แต่ถ้ามันไม่ได้ดังนั้นเพื่อส่งข้อมูลเกี่ยวกับระบบของคุณและการใช้งาน Python ให้ฉันฉันจะทำการวิจัยเพิ่มเติมเพื่อแก้ไข
PADYMKO

9

คำเตือน: Adam Matan ไม่สนับสนุนการใช้งานนี้ใน pip> 10.0 นอกจากนี้อ่านความคิดเห็นของ @ sinoroc ด้านล่าง

สิ่งนี้ได้รับแรงบันดาลใจจากคำตอบของ Adam Matan ( คำตอบที่ได้รับการยอมรับ):

import tabulate
try:
  from pip import get_installed_distributions
except:
  from pip._internal.utils.misc import get_installed_distributions

tabpackages = []
for _, package in sorted([('%s %s' % (i.location, i.key), i) for i in get_installed_distributions()]):
  tabpackages.append([package.location, package.key, package.version])

print(tabulate.tabulate(tabpackages))

ซึ่งจะพิมพ์ตารางในรูปแบบของ

19:33 pi@rpi-v3 [iot-wifi-2] ~/python$ python installed_packages.py
-------------------------------------------  --------------  ------
/home/pi/.local/lib/python2.7/site-packages  enum-compat     0.0.2
/home/pi/.local/lib/python2.7/site-packages  enum34          1.1.6
/home/pi/.local/lib/python2.7/site-packages  pexpect         4.2.1
/home/pi/.local/lib/python2.7/site-packages  ptyprocess      0.5.2
/home/pi/.local/lib/python2.7/site-packages  pygatt          3.2.0
/home/pi/.local/lib/python2.7/site-packages  pyserial        3.4
/usr/local/lib/python2.7/dist-packages       bluepy          1.1.1
/usr/local/lib/python2.7/dist-packages       click           6.7
/usr/local/lib/python2.7/dist-packages       click-datetime  0.2
/usr/local/lib/python2.7/dist-packages       construct       2.8.21
/usr/local/lib/python2.7/dist-packages       pyaudio         0.2.11
/usr/local/lib/python2.7/dist-packages       tabulate        0.8.2
-------------------------------------------  --------------  ------

sudoซึ่งช่วยให้คุณได้อย่างง่ายดายแล้วมองเห็นซึ่งแพคเกจที่คุณติดตั้งที่มีและไม่มี


สิ่งที่ควรทราบ: ฉันสังเกตเห็นว่าเมื่อฉันติดตั้งแพ็คเก็ตหนึ่งครั้งผ่านไปsudoหนึ่งครั้งโดยไม่ต้องใช้สิ่งใดสิ่งหนึ่งจะมีความสำคัญเหนือกว่าเพื่อให้อีกอันหนึ่งไม่ได้อยู่ในรายการ ฉันเชื่อว่ามีเพียงรายการเดียวในไดเรกทอรีท้องถิ่นแล้ว อาจปรับปรุงได้


1
ไม่ไม่แนะนำให้ดูที่นี่: pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program
sinoroc

1
@sinoroc ขอบคุณที่ชี้ให้เห็น ดูเหมือนว่าคะแนน 1 ถึง 3 จะไม่สามารถใช้ได้กับโซลูชันนี้เนื่องจากสคริปต์นี้มีจุดประสงค์เพื่อใช้pipเพียงครั้งเดียวแล้วออก ดูเหมือนจะเป็นปัญหามากกว่าที่พฤติกรรมสามารถเปลี่ยนได้
Daniel F

ตกลงเหตุผลที่ไม่มี API สาธารณะใช้ไม่ได้กับโค้ดเฉพาะชิ้นนี้ แต่เนื่องจาก pip ไม่ได้ผูกพันกับการรับประกัน API สาธารณะจึงสามารถเปลี่ยน API ภายในโครงสร้างรหัสและอื่น ๆ ได้ในรีลีสในภายหลังอย่างที่เคยทำมาก่อน นี่คือสาเหตุที่รหัสนี้มีการลอง / ยกเว้นเพื่อตรวจสอบการจัดระเบียบรหัสภายในก่อนหน้าซึ่งมีวัตถุประสงค์เพื่อชี้แจงว่า API ภายในเป็น API ภายในไม่ใช่สาธารณะ ( _internal) สรุปแล้วมันใช้งานได้ดี แต่เป็นการฝึกฝนที่ไม่ดี มีทางเลือกที่ดีกว่าบางคนอยู่ในคำตอบของคำถามนี้
sinoroc

1
สคริปต์นี้จะไม่ทำงานหากไม่มีโมดูล "pip"
Alexander Stohr


6

ในกรณีที่คุณมีการแจกจ่ายงูใหญ่งูใหญ่ติดตั้งคุณสามารถใช้

$conda list

นอกเหนือจากการแก้ปัญหาที่อธิบายไว้ข้างต้น


คุณรันบรรทัดนี้ที่ไหน / อย่างไร
HuckIt

ถ้าคุณอยู่ในเครื่อง UNIX / Mac OS X ของคุณเปิดประเภทอาคารและเพียงแค่คุณconda installก็ควรจะทำงาน :)
Shreyas

ฉันใช้ Windows 7 ฉันพบมันในเส้นทางของฉันจริง ๆ แต่ conda.exe อยู่ใน AppData \ Local \ Continuum \ Anaconda \ Scripts
HuckIt

6
  1. ในการรับโมดูลที่มีอยู่ทั้งหมดให้เรียกใช้ sys.modules
  2. เพื่อรับโมดูลที่ติดตั้งทั้งหมด(อ่าน: ติดตั้งโดยpip) คุณอาจดูpip.get_installed_distributions()

สำหรับวัตถุประสงค์ที่สองโค้ดตัวอย่าง:

import pip
for package in pip.get_installed_distributions():
    name = package.project_name # SQLAlchemy, Django, Flask-OAuthlib
    key = package.key # sqlalchemy, django, flask-oauthlib
    module_name = package._get_metadata("top_level.txt") # sqlalchemy, django, flask_oauthlib
    location = package.location # virtualenv lib directory etc.
    version = package.version # version number

คำสั่งsys.modulesไม่ทำงานใน Python ล่าสุดของ OSX NameError: ชื่อ 'ระบบ' ไม่ได้ถูกกำหนด
LéoLéopold Hertz 준영

@Masi คุณหมายถึง/usr/bin/pythonหรือว่ามาจากpython.orgหรือไม่ สำหรับคนก่อนหน้านี้ฉันสามารถใช้ได้sys.modulesโดยไม่มีปัญหา
yegle

ผมหมายถึง/ usr / bin / หลาม
LéoLéopold Hertz 준영

@Masi ไม่แน่ใจว่าคุณยังสนใจปัญหานี้อยู่หรือไม่ เห็นได้ชัดว่าคุณกำลังใช้แทนsystem.modules sys.modules
yegle

ฮ่า ๆ. ความผิดพลาดของฉันคือฉันไม่ได้อิมพอร์ต sys -package ดังนั้นแทนที่จะเรียกใช้นำเข้า sys; sys.modulesทำงานตามที่คาดไว้
LéoLéopold Hertz 준영

6

สำหรับเวอร์ชั่นล่าสุดเช่น Pip 20

รันสิ่งต่อไปนี้ในเครื่องมือแก้ไข python หรือ IPython ของคุณ

import pkg_resources; 
installed_packages = {d.project_name: d.version for d in pkg_resources.working_set}
print(installed_packages)

อ่านคำตอบอื่น ๆ แล้วดึงคอมโบนี้ซึ่งเร็วที่สุดและง่ายที่สุดใน Python


4

pip freezeทำการค้นหาแพ็คเกจทั้งหมด แต่สามารถเขียนคำสั่งต่อไปนี้เพื่อแสดงรายการเส้นทางทั้งหมดที่มีแพ็คเกจ python

>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

4

มีหลายวิธีในการดูแลแมว

  • วิธีที่ง่ายที่สุดคือการใช้pydocฟังก์ชั่นโดยตรงจากเปลือกด้วย:
    pydoc modules

  • แต่สำหรับข้อมูลเพิ่มเติมให้ใช้เครื่องมือที่เรียกว่าpip-dateซึ่งจะบอกวันที่ติดตั้งให้คุณด้วย
    pip install pip-date


ป้อนคำอธิบายรูปภาพที่นี่


3

มีความคิดมากมายตอนแรกฉันครุ่นคิดถึงสองสิ่งนี้:

จุดเล็ก ๆ

ข้อเสีย: ไม่ได้ติดตั้งเสมอ

ช่วยเหลือ (โมดูล)

ข้อเสีย: ส่งออกไปยังคอนโซล; ด้วยโมดูลที่เสียหาย (ดู ubuntu ... ) สามารถ segfault

ฉันต้องการวิธีการง่ายๆโดยใช้ไลบรารีพื้นฐานและเข้ากันได้กับ python 2.x แบบเก่า

และฉันเห็นแสง: listmodules.py

ซ่อนอยู่ในไดเรกทอรีแหล่งเอกสารใน 2.5 เป็นสคริปต์ขนาดเล็กที่แสดงรายการโมดูลที่มีอยู่ทั้งหมดสำหรับการติดตั้ง Python

ข้อดี:

ใช้เฉพาะimp, sys, os, re, time

ออกแบบมาเพื่อรันบน Python 1.5.2 และใหม่กว่า

ซอร์สโค้ดมีขนาดกะทัดรัดจริง ๆ ดังนั้นคุณสามารถแก้ไขได้ง่ายเช่นส่งรายการข้อยกเว้นของโมดูลบั๊กกี้ (อย่าพยายามนำเข้า)


3

ฉันต้องการค้นหาแพ็คเกจเฉพาะรุ่นที่มีอยู่ใน AWS Lambda ฉันทำอย่างนั้นกับการตอบโต้กับความคิดจากหน้านี้ ฉันกำลังแบ่งปันเพื่อลูกหลาน

import pkgutil

__version__ = '0.1.1'

def get_ver(name):
    try:
        return str(__import__(name).__version__)
    except:
        return None

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': [{
                   'path': m.module_finder.path,
                   'name': m.name,
                   'version': get_ver(m.name),
                 } for m in list(pkgutil.iter_modules())
                 #if m.module_finder.path == "/var/runtime" # Uncomment this if you only care about a certain path
                ],
    }

สิ่งที่ฉันค้นพบคือห้องสมุด boto3 ที่ให้นั้นล้าสมัยและมันไม่ใช่ความผิดของฉันที่รหัสของฉันล้มเหลว ฉันต้องการเพิ่ม boto3 และ botocore ในโครงการของฉัน แต่ถ้าไม่มีสิ่งนี้ฉันก็คงจะตีหัวของฉันคิดว่ารหัสของฉันไม่ดี

{
  "statusCode": 200,
  "body": [
    {
      "path": "/var/task",
      "name": "lambda_function",
      "version": "0.1.1"
    },
    {
      "path": "/var/runtime",
      "name": "bootstrap",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "boto3",
      "version": "1.9.42"
    },
    {
      "path": "/var/runtime",
      "name": "botocore",
      "version": "1.12.42"
    },
    {
      "path": "/var/runtime",
      "name": "dateutil",
      "version": "2.7.5"
    },
    {
      "path": "/var/runtime",
      "name": "docutils",
      "version": "0.14"
    },
    {
      "path": "/var/runtime",
      "name": "jmespath",
      "version": "0.9.3"
    },
    {
      "path": "/var/runtime",
      "name": "lambda_runtime_client",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "lambda_runtime_exception",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "lambda_runtime_marshaller",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "s3transfer",
      "version": "0.1.13"
    },
    {
      "path": "/var/runtime",
      "name": "six",
      "version": "1.11.0"
    },
    {
      "path": "/var/runtime",
      "name": "test_bootstrap",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "test_lambda_runtime_client",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "test_lambda_runtime_marshaller",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "urllib3",
      "version": "1.24.1"
    },
    {
      "path": "/var/lang/lib/python3.7",
      "name": "__future__",
      "version": null
    },
...

สิ่งที่ผมค้นพบก็ยังแตกต่างจากสิ่งที่พวกเขาอย่างเป็นทางการเผยแพร่ ในขณะที่เขียนนี้:

  • ระบบปฏิบัติการ - Amazon Linux
  • AMI - amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2
  • เคอร์เนล Linux - 4.14.77-70.59.amzn1.x86_64
  • AWS SDK สำหรับ JavaScript - 2.290.0 \
  • SDK สำหรับ Python (Boto 3) - 3-1.7.74 botocore-1.10.74

1

การติดตั้ง

pip install pkgutil

รหัส

import pkgutil

for i in pkgutil.iter_modules(None): # returns a tuple (path, package_name, ispkg_flag)
    print(i[1]) #or you can append it to a list

ตัวอย่างผลลัพธ์:

multiprocessing
netrc
nntplib
ntpath
nturl2path
numbers
opcode
pickle
pickletools
pipes
pkgutil

1

นี่คือวิธีการแก้ปัญหารหัสหลามที่จะกลับรายการของโมดูลที่ติดตั้ง หนึ่งสามารถแก้ไขรหัสเพื่อรวมหมายเลขรุ่นได้อย่างง่ายดาย

import subprocess
import sys
from pprint import pprint

installed_packages = reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze']).decode('utf-8')
installed_packages = installed_packages.split('\r\n')
installed_packages = [pkg.split('==')[0] for pkg in installed_packages if pkg != '']
pprint(installed_packages)


-10

จากเปลือก

ls site-packages

หากไม่เป็นประโยชน์คุณสามารถทำได้

import sys
import os
for p in sys.path:
    print os.listdir( p )

และดูสิ่งที่ผลิต


ไดเรกทอรีไซต์แพ็คเกจใด สิ่งนี้อาจทำได้ดีกว่า: ls / usr / {local /,} lib / python $ (python -V 2> & 1 | cut -d "" -f2 | cut -d. -f1-2) / แพ็คเกจเว็บไซต์
vezult

นอกจากนี้สิ่งนี้จะไม่แสดงโมดูลในตัวหรือโมดูลใน PYTHONPATH ที่กำหนดเองหรือโมดูลที่ติดตั้งใน "โหมดการพัฒนา" setuptools เป็นต้น
dF

/usr/local/lib/python2.5/site-packages ของฉันว่างเปล่าแม้ว่าฉันได้ติดตั้งโมดูลแล้ว
LéoLéopold Hertz 준영

14
รุ่งโรจน์ที่ไม่ลบคำตอบที่ลงคะแนนนี้ ชุมชนมีประโยชน์ที่จะเห็นว่าทำไมคำตอบทั่วไปจึงถือเป็นความผิด
Jeremy Stein

1
@JeremyStein กลยุทธ์ที่ดีกว่า (มีประโยชน์มากขึ้นและอาจจะน้อยตัวแทนทำลาย) อาจจะมีการแก้ไขคำถามที่จะอธิบายว่าทำไมมันผิดครั้งนี้ได้รับการอธิบายในการแสดงความคิดเห็น ...
ไคล์ Strand
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.