Làm cách nào tôi có thể nhận được danh sách các mô-đun Python được cài đặt cục bộ?


998

Tôi muốn có một danh sách các mô-đun Python, trong bản cài đặt Python của tôi (máy chủ UNIX).

Làm thế nào bạn có thể nhận được một danh sách các mô-đun Python được cài đặt trong máy tính của bạn?


77
bạn chỉ có thể làm >>> trợ giúp () và sau đó >>> mô-đun
Julius Naeumann

1
Có một sự thay thế? giúp đỡ () treo cho tôi.
Paulo Carvalho

2
Rất nhiều câu trả lời cho rằng bạn có quyền truy cập vào một dòng lệnh. Nếu bạn đang sử dụng AWS Lambda, bạn phải làm tất cả từ bên trong Python. Xem stackoverflow.com/a/54939905/117471
Bruno Bronosky

Câu trả lời:


610

Giải pháp

Không sử dụng với pip> 10.0!

50 xu của tôi để nhận pip freezedanh sách giống như từ tập lệnh 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)

Như một (quá dài) một lớp lót:

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

Tặng:

['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']

Phạm vi

Giải pháp này áp dụng cho phạm vi hệ thống hoặc phạm vi môi trường ảo và bao gồm các gói được cài đặt bởi setuptools, pipvà (không cho phép ) easy_install.

Trường hợp sử dụng của tôi

Tôi đã thêm kết quả của cuộc gọi này vào máy chủ bình của mình, vì vậy khi tôi gọi nó với http://example.com/exampleServer/environmentdanh sách các gói được cài đặt trên virtualenv của máy chủ. Nó làm cho việc gỡ lỗi dễ dàng hơn rất nhiều.

Hãy cẩn thận

Tôi đã nhận thấy một hành vi kỳ lạ của kỹ thuật này - khi trình thông dịch Python được gọi trong cùng thư mục với một setup.pytệp, nó không liệt kê gói được cài đặt bởi setup.py.

Các bước để tái sản xuất:

Tạo một môi trường ảo
$ cd /tmp
$ virtualenv test_env
New python executable in test_env/bin/python
Installing setuptools, pip...done.
$ source test_env/bin/activate
(test_env) $ 
Nhân bản một repo git với 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.

Chúng tôi đã cư xử setup.pytrong /tmp/behave:

(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
Cài đặt gói python từ git repo
(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

Nếu chúng ta chạy giải pháp đã nói ở trên /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'

Nếu chúng ta chạy giải pháp đã nói ở trên /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.5a1là mất tích từ ví dụ thứ hai, bởi vì thư mục làm việc chứa behave's setup.pytập tin.

Tôi không thể tìm thấy bất kỳ tài liệu tham khảo về vấn đề này trong tài liệu. Có lẽ tôi sẽ mở một lỗi cho nó.


5
Cảm ơn bạn cho câu trả lời này! Tôi nghĩ rằng nó trả lời tốt hơn câu hỏi vì tôi hỏi các mô-đun Python được cài đặt "cục bộ". Pip đóng băng cũng không phải lúc nào cũng là cách để đi. Điều này hoạt động tốt hơn - tôi nghĩ.
Léo Léopold Hertz

3
@Masi Chỉ cần thêm một lời giải thích chi tiết về sự báo trước của giải pháp này. Nó thực sự là một trong những lạ.
Adam Matan

21
Một cách khác:import pkg_resources; installed_packages = [(d.project_name, d.version) for d in pkg_resources.working_set]
ebolyen

14
Kể từ pip 10, câu trả lời này sẽ không còn hoạt động. Nhận xét từ @ebolyen cho thấy các lệnh thay thế hoạt động. Tôi đã đi đến kết luận tương tự và đăng mã sửa đổi hoàn chỉnh dưới đây.
Big_Al_Tx

5
Trong các phiên bản gần đây của pip, điều này sẽ không hoạt động, mang lại thông báo lỗi AttributeError: module 'pip' has no attribute 'get_installed_distributions'.
HelloGoodbye

1039
help('modules')

trong trình bao / nhắc Python.


10
@dF pydoc moduleshoạt động. Bạn nên gửi nó như một câu trả lời.
Abizern

37
Đã cho tôi một lỗi seg!
zanbri

3
nobar, zanbri, @Joe Frambach: trên Ubuntu? Có một lỗi được mô tả ở đây: bugs.launchpad.net/ubuntu/+source/python2.7/+bug/896836
ChristopheD

2
Làm thế nào tôi có thể nhận thêm thông tin về nơi các mô-đun được cài đặt và phiên bản hiện tại là gì?
tò mò

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

285

Bây giờ, những phương pháp này tôi đã thử bản thân mình và tôi đã nhận được chính xác những gì được quảng cáo: Tất cả các mô-đun.

Than ôi, thực sự bạn không quan tâm nhiều đến stdlib, bạn biết những gì bạn nhận được với một cài đặt python.

Thực sự, tôi muốn những thứ mà tôi đã cài đặt.

Điều thực sự, đáng ngạc nhiên, chỉ hoạt động tốt là:

pip freeze

Mà trả lại:

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

Tôi nói "thật đáng ngạc nhiên" bởi vì công cụ cài đặt gói là nơi chính xác mà người ta mong đợi để tìm thấy chức năng này, mặc dù không có tên 'đóng băng' nhưng bao bì trăn rất kỳ lạ, tôi rất lúng túng rằng công cụ này có ý nghĩa. Pip 0.8.2, Python 2.7.


4
Tôi đoán ý tưởng đằng sau cái tên là bạn có được một ảnh chụp nhanh "đóng băng" về những gì được cài đặt ngay bây giờ, sau này bạn có thể đưa trở lại vào pip để có được chính xác các mô-đun được cài đặt trong một môi trường khác.
Ryan C. Thompson

Arash, bạn cũng có thể cài đặt pip trong Windows! Đầu tiên cài đặt setuptools và sau đó sử dụng easy_install để cài đặt pip :)
gawbul

Điều này là tuyệt vời, nhưng nó dường như bỏ lỡ một số thư viện tôi đã cài đặt. Ví dụ, nó không liệt kê PyQt.
Junuxx

8
Bắt đầu từ pip 1.3 có lệnh danh sách .
Piotr Dobrogost

nó hoạt động Thật là một con trăn lộn xộn. Tại sao họ không thể có được hành động của mình cùng nhau và đưa ra các giải pháp tương tự như những gì tồn tại trong Rails? (Gemfile, bundler, rvm)
Dimitris

106

Kể từ phiên bản pip 1.3, bạn đã có quyền truy cập vào:

pip list

Mà dường như là cú pháp đường cho "pip đóng băng". Nó sẽ liệt kê tất cả các mô-đun cụ thể cho cài đặt hoặc virtualenv của bạn, cùng với số phiên bản của chúng. Thật không may, nó không hiển thị số phiên bản hiện tại của bất kỳ mô-đun nào, cũng không rửa bát hoặc đánh giày.


4
Ngoài ra còn có pip list --localđể phân biệt giữa virtualenvcác gói trang web toàn cầu, được thảo luận ở đây .
Ioannis Filippidis

1
Đến nay là tốt nhất. Nó cũng lấy các phiên bản.
aerijman

pip listlà đơn giản nhất và tốt nhất. Dưới đây là các tùy chọn và chi tiết.
Levi Baguley

86
  • Trong ipythonbạn có thể gõ " importTab".

  • Trong trình thông dịch Python chuẩn, bạn có thể nhập " help('modules')".

  • Tại dòng lệnh, bạn có thể sử dụng .pydoc modules

  • Trong một kịch bản, gọi pkgutil.iter_modules().


5
pkgutil.iter_modules()hoạt động, giải pháp pip ở trên không liệt kê tất cả các gói, chỉ những gói được cài đặt qua pip.
siêu dữ liệu

2
Tuyệt vời! Tôi nghĩ rằng họ đã cải thiện tài liệu, vì câu hỏi đã được hỏi. mô-đun pydoc spam tìm kiếm thư rác trong tài liệu của mô-đun. Điểm cuối cùng dường như cung cấp cho bạn thông tin đầy đủ để sử dụng mô-đun. @metaperture Bạn có thể, vui lòng, đưa ra một ví dụ về cách bạn liệt kê tất cả các mô-đun cục bộ được cài đặt (không phải danh sách khổng lồ của stlib bằng trợ giúp ('mô-đun')) bởi pkgutil.iter_modules () .
Léo Léopold Hertz

2
@ LéoLéopoldHertz 준영 Hãy thử đoạn trích này : python -c 'import pkgutil;print [x[1] for x in list(pkgutil.iter_modules())]'. Nó sẽ kết xuất tất cả các tên mô-đun thành một danh sách Python thực sự lớn. Các x[1]bit được sử dụng để nhổ ra tên mô-đun của các bộ được tạo ra bởi pkgutil.iter_modules().
Philip Conrad

76

Tôi chỉ sử dụng điều này để xem các mô-đun hiện đang sử dụng:

import sys as s
s.modules.keys()

trong đó hiển thị tất cả các mô-đun chạy trên python của bạn.

Đối với tất cả các mô-đun tích hợp sử dụng:

s.modules

Đó là một dict chứa tất cả các mô-đun và các đối tượng nhập khẩu.


2
# Sau khi bạn nhập sys "nhập sys dưới dạng s", bạn có thể in bằng: print sys.modules.keys ()
Dan Evans

Không chắc chắn tại sao bài viết của tôi đã được chỉnh sửa, nhưng cảm ơn bạn đã sử dụng thông tin tôi đã đăng để sửa lỗi trong các bài viết trước. Bạn sẽ trả về lỗi nếu bạn sử dụng trợ giúp () so với trợ giúp (''). Điều này cũng đúng với dir ('') & sys (''), v.v. Hy vọng điều này sẽ giúp & không bị xóa.
Dan Evans

Bỏ qua bài viết cuối cùng của tôi, bài viết này đã không được chỉnh sửa. Tôi đã nghĩ về một bài viết tương tự được tìm thấy ở đây: stackoverflow.com/questions/139180/. Xin lỗi vì sự nhầm lẫn.
Dan Evans

7
Được nâng cấp, bởi vì đây là phương pháp duy nhất dường như hoạt động trên các hệ thống bị ràng buộc pydockhông pipcài đặt (NAS trong trường hợp của tôi).
Thomas

1
Đồng ý với Thomas. Tôi đang sử dụng repl.it, ví dụ, đây cũng là một loại môi trường bị hạn chế. help('modules')chỉ treo mà không có phản hồi cho tôi. Nhưng cách tiếp cận này có hiệu sysquả hoàn hảo
Sergiy Kolodyazhnyy

63

Trong vỏ bình thường chỉ cần sử dụng

pydoc modules

Dường như ở trên chỉ hoạt động trên các nền tảng 'nix. Trong mọi trường hợp, tôi đã tìm và chạy tập lệnh, điều chỉnh lệnh như sau: c: \ bin \ pythos_2.7 \ lib \ pydoc.py - danh sách đó mất mãi mãi để xây dựng, định dạng bị mất và nó bỏ qua phiên bản đã cài đặt con số. Tôi sẽ vượt qua.
David A. Gray

2
@ DavidA.Gray Chỉ cần thử điều này trên máy Windows với Python 3 và thực tế nó hoạt động. Sử dụng trình khởi chạy python windows bạn có thể làm py -m pydoc modulestrong cmd hoặc Powershell.
VKK

pydoc moduleskhông hoạt động với tôi trong Windows 10 với Python 3.6, nhưng sửa đổi @VKK: py -m pydoc moduleskhông hoạt động trong cmd / Powershell.
Martin

41

Kể từ pip 10, câu trả lời được chấp nhận sẽ không còn hoạt động. Nhóm phát triển đã loại bỏ quyền truy cập vào get_installed_distributionsthói quen. Có một chức năng thay thế trong việc setuptoolslàm điều tương tự. Đây là phiên bản thay thế hoạt động với 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)

Vui lòng cho tôi biết nếu nó cũng sẽ không hoạt động trong các phiên bản trước của pip.


2
Tôi đã tìm kiếm giải pháp này và phá vỡ bộ não của tôi để cố gắng tìm ra pkg_resource. Nếu tôi có thể nâng cao điều này hơn một lần tôi sẽ làm. Cảm ơn bạn, @Big_Al_Tx! Cập nhật: Ngoại trừ .... khi tôi thực hiện 'đóng băng pip' trong môi trường ảo của mình và so sánh nó với đầu ra của điều này, có những gói bị thiếu. Bất kỳ suy nghĩ về lý do tại sao điều đó có thể / sẽ xảy ra?
số

@numberwhun - Tôi rất vui vì điều này đã làm việc cho bạn. Tôi xin lỗi, nhưng tôi không có câu trả lời cho sự khác biệt với pip freeze; độ sâu kiến ​​thức của tôi về chủ đề này là khá hạn chế. Tôi loay hoay tìm cách giải quyết khi câu trả lời được chấp nhận không hiệu quả với tôi và tôi đã thử kết hợp nó với một câu trả lời liên quan đến setuptoolsvà khiến nó hoạt động.
Big_Al_Tx

github.com/pypa/pip/issues/5243 - Cuộc thảo luận của nhóm phát triển về quyền truy cập đã xóa get_installed_distributions routine.
bl79

@ bl79 - Tôi nghĩ đó là nơi chính xác mà tôi có tài liệu tham khảo setuptools.
Big_Al_Tx

@Big_Al_Tx: Chà, tôi đã làm việc xung quanh tùy chọn setuptools (đó là waaaay để làm xáo trộn cho nhu cầu của tôi) và tôi đã thực hiện điều này: cần nó để làm .... Yay !!
số

26

Nếu chúng ta cần liệt kê các gói đã cài đặt trong shell Python, chúng ta có thể sử dụng helplệnh như sau

>>help('modules package')

22

Tôi thường sử dụng pip list để có được một danh sách các gói (với phiên bản).

Điều này hoạt động trong một môi trường ảo, tất nhiên. Để hiển thị những gì được cài đặt chỉ trong môi trường ảo (không phải gói toàn cầu), hãy sử dụngpip list --local .

Đây là tài liệu hiển thị tất cả các pip listtùy chọn có sẵn , với một số ví dụ tốt.


13

Tìm kiếm rất đơn giản bằng 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]

Có bất kỳ lý do để sử dụng trong khi thay vì một vòng lặp for? Tôi đã viết bằng cách sử dụng for m in iter_modules()và nó đã làm việc như là tốt.
Joao Ponte

13

trên windows, Nhập cái này vào cmd

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

Điều này làm việc cho tôi bằng cách sử dụng: python3 -m pip đóng băng - cho python 3.5.3.
dpminusa

Điều này hoạt động tốt và bạn không cần phải ở trong thư mục libs nếu các biến của bạn được xác định
mcy

12

Tôi đã chạy vào một python 2.7 được cài đặt tùy chỉnh trên OS X. Nó yêu cầu X11 để liệt kê các mô-đun được cài đặt (cả sử dụng trợ giúp và pydoc).

Để có thể liệt kê tất cả các mô-đun mà không cần cài đặt X11, tôi đã chạy pydoc dưới dạng máy chủ http, tức là:

pydoc -p 12345

Sau đó, có thể chỉ đạo Safari http://localhost:12345/để xem tất cả các mô-đun.


12

Thử những thứ này xem

pip list

hoặc là

pip freeze

Điều này hoạt động từ một vỏ. Nhưng không phải trong python
user7194913

12

Điều này sẽ giúp

Trong thiết bị đầu cuối hoặc IPython, gõ:

help('modules')

sau đó

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

Đây phải là câu trả lời được chấp nhận! Một dòng :)
MostPitt

9

Giải pháp này là chính dựa trên các mô-đun importlibpkgutilhoạt động với CPython 3.4 và CPython 3.5, nhưng không hỗ trợ cho CPython 2.


Giải trình

  1. sys.builtin_module_names- tên tất cả các mô-đun tích hợp (xem câu trả lời của tôi ở đây )
  2. pkgutil.iter_modules() - trả về thông tin về tất cả các mô-đun có sẵn
  3. importlib.util.find_spec() - trả về thông tin về việc nhập mô-đun, nếu tồn tại
  4. BuiltinImporter- một nhà nhập khẩu cho các mô-đun tích hợp ( tài liệu )
  5. SourceFileLoader- trình nhập cho mô-đun Python chuẩn (theo mặc định có phần mở rộng * .py) ( tài liệu )
  6. ExtensionFileLoader- nhà nhập khẩu cho các mô-đun dưới dạng thư viện dùng chung (được viết trên C hoặc C ++)

Mã đầy đủ

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

Sử dụng

Đối với CPython3.5 (cắt ngắn)

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

Đối với CPython3.4 (cắt ngắn)

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

Bạn có thể vui lòng so sánh cách tiếp cận của bạn với cách tiếp cận của Adam ở đây stackoverflow.com/a/23885252/54964
Léo Léopold Hertz

@ Léo Léopold Hertz, tại sao bạn cần nó?
PADYMKO

Để hiểu cách tiếp cận của bạn tốt hơn / tồi tệ hơn cách tiếp cận của Adam.
Léo Léopold Hertz 준영

1
@ Léo Léopold Hertz. Một câu trả lời ngắn gọn: hãy tự thử nó trong một sản phẩm và tự rút ra kết luận. Câu trả lời dài: cách tiếp cận của Adam dựa trên pip- hệ thống quản lý gói được sử dụng để cài đặt và quản lý các gói phần mềm được viết bằng Python và kết quả pip.get_installed_distributions()trả về các mô-đun được cài đặt với pip. Câu trả lời của tôi hoàn toàn dựa trên thư viện chuẩn của Python và bao gồm tất cả các mô-đun có sẵn để nhập. Một nhược điểm lớn nhất câu trả lời của tôi - không hỗ trợ cho CPython 2.
PADYMKO

1
@ Léo Léopold Hertz bạn nhầm rồi, nó làm được. Tôi đã thử nó trên máy tính của tôi. Câu trả lời của tôi chứa ý nghĩa đặc biệt **truncated**, trong đó một đầu ra bị cắt ngắn. Có thể bạn không cẩn thận, nhưng nếu không, vì vậy để gửi cho tôi thông tin về hệ thống của bạn và việc triển khai Python, tôi sẽ thực hiện nghiên cứu bổ sung để khắc phục nó.
PADYMKO

9

Cảnh báo: Adam Matan không khuyến khích sử dụng này trong pip> 10.0. Ngoài ra, hãy đọc bình luận của @ sinoroc bên dưới

Điều này được lấy cảm hứng từ câu trả lời của Adam Matan (người được chấp nhận):

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

sau đó in ra một bảng dưới dạng

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

cho phép bạn sau đó dễ dàng nhận ra gói nào bạn đã cài đặt có và không có sudo.


Một lưu ý sang một bên: Tôi nhận thấy rằng khi tôi cài đặt gói một lần qua sudovà một lần mà không có, thì một ưu tiên sẽ không được liệt kê (chỉ một vị trí được hiển thị). Tôi tin rằng chỉ có một trong thư mục địa phương được liệt kê. Điều này có thể được cải thiện.


1
Không. Điều này không được khuyến khích, xem tại đây: pip.pypa.io/en/urdy/user_guide/#USE-pip-from-your-program
sinoroc

1
@sinoroc Cảm ơn bạn đã chỉ ra điều này. Điểm 1 đến 3 dường như không thể áp dụng cho giải pháp này, vì tập lệnh này có mục đích duy nhất là sử dụng pipmột lần và sau đó thoát. Nó dường như là một vấn đề mà hành vi có thể thay đổi.
Daniel F

Đồng ý, lý do tại sao không có API công khai không áp dụng cho đoạn mã cụ thể này. Nhưng vì pip không bị ràng buộc để đảm bảo API công khai, nên có thể thay đổi API nội bộ, cấu trúc mã, v.v. trong bản phát hành sau, giống như trước đây. Đây là lý do tại sao mã này có một thử / ngoại trừ, để nắm bắt việc sắp xếp lại mã nội bộ trước đó nhằm làm rõ rằng các API nội bộ là các API nội bộ không phải là API công khai ( _internal). Tất cả trong tất cả, nó rõ ràng hoạt động nhưng là thực hành xấu. Có những lựa chọn thay thế tốt hơn, một số trong các câu trả lời khác cho câu hỏi này.
sinoroc

1
tập lệnh này sẽ không hoạt động nếu mô-đun "pip" không có ở đó.
Alexander Stohr


6

Trong trường hợp bạn đã cài đặt bản phân phối trăn anaconda , bạn cũng có thể sử dụng

$conda list

ngoài các giải pháp được mô tả ở trên.


Ở đâu / làm thế nào để bạn chạy dòng này?
HuckIt

Nếu bạn đang sử dụng máy UNIX / Mac OS X, hãy mở thiết bị đầu cuối của bạn và chỉ cần gõ conda install, nó sẽ hoạt động :)
Shreyas

Tôi đang dùng máy Windows 7. Tôi thực sự tìm thấy nó trong đường dẫn của mình, nhưng conda.exe nằm trong AppData \ Local \ Continuum \ Anaconda \ Sc scripts.
HuckIt

6
  1. để có được tất cả các mô-đun có sẵn, hãy chạy sys.modules
  2. để có được tất cả các mô-đun đã cài đặt (đọc: được cài đặt bởi pip), bạn có thể nhìn vàopip.get_installed_distributions()

Đối với mục đích thứ hai, mã ví dụ:

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

Lệnh sys.modules không hoạt động trong Python mới nhất của OSX. NameError: tên 'hệ thống' không được xác định .
Léo Léopold Hertz

@Masi Ý bạn là /usr/bin/pythonhay người đến từ python.org ? Đối với cái trước, tôi có thể sử dụng sys.modulesmà không có vấn đề.
yegle

Ý tôi là / usr / bin / python .
Léo Léopold Hertz

@Masi Không chắc chắn nếu bạn vẫn quan tâm đến vấn đề này. Rõ ràng bạn đang sử dụng system.modulesthay vì sys.modules.
yegle

Cười lớn. Sai lầm của tôi là ban đầu tôi không nhập sys -package. Vì vậy, chạy thay vì nhập sys; sys.modules hoạt động như mong đợi.
Léo Léopold Hertz

6

Đối với phiên bản gần đây, chẳng hạn như Pip 20

Chạy phần sau trong trình soạn thảo python hoặc IPython của bạn

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

Đọc các câu trả lời khác và kết hợp lại với nhau, đây là cách nhanh nhất và dễ nhất trong Python


4

Pip đóng băng tất cả các gói tìm kiếm tuy nhiên người ta có thể chỉ cần viết lệnh sau để liệt kê tất cả các đường dẫn trong đó các gói python.

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

4

Có nhiều cách để da mèo.

  • Cách đơn giản nhất là sử dụng pydochàm trực tiếp từ shell với:
    pydoc modules

  • Nhưng để biết thêm thông tin, hãy sử dụng công cụ có tên pip-date cũng cho bạn biết ngày cài đặt.
    pip install pip-date


nhập mô tả hình ảnh ở đây


3

Có nhiều ý tưởng, ban đầu tôi đang suy nghĩ về hai điều này:

pip

Nhược điểm: không phải lúc nào cũng được cài đặt

trợ giúp ('mô-đun')

Nhược điểm: đầu ra cho bàn điều khiển; với các mô-đun bị hỏng (xem ubfox ...) có thể segfault

Tôi cần một cách tiếp cận dễ dàng, sử dụng các thư viện cơ bản và tương thích với python cũ 2.x

Và tôi thấy ánh sáng: listmodules.py

Ẩn trong thư mục nguồn tài liệu trong 2.5 là một tập lệnh nhỏ liệt kê tất cả các mô-đun có sẵn để cài đặt Python.

Ưu điểm:

chỉ sử dụng imp, sys, os, re, time

được thiết kế để chạy trên Python 1.5.2 và mới hơn

mã nguồn thực sự nhỏ gọn, vì vậy bạn có thể dễ dàng sửa đổi nó, ví dụ để vượt qua một danh sách ngoại lệ của các mô-đun lỗi (không thử nhập chúng)


3

Tôi cần tìm phiên bản cụ thể của các gói có sẵn theo mặc định trong AWS Lambda. Tôi đã làm như vậy với một mashup ý tưởng từ trang này. Tôi đang chia sẻ nó cho hậu thế.

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
                ],
    }

Những gì tôi phát hiện ra là thư viện boto3 được cung cấp đã hết hạn và đó không phải là lỗi của tôi khi mã của tôi bị lỗi. Tôi chỉ cần thêm boto3 và botocore vào dự án của mình. Nhưng nếu không có điều này, tôi sẽ đập đầu vào suy nghĩ rằng mã của tôi là xấu.

{
  "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
    },
...

Những gì tôi phát hiện ra cũng khác với những gì họ chính thức xuất bản . Tại thời điểm viết này:

  • Hệ điều hành - Amazon Linux
  • AMI - amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2
  • Nhân Linux - 4.14.77-70.59.amzn1.x86_64
  • SDK AWS cho JavaScript - 2.290.0 \
  • SDK cho Python (Boto 3) - 3-1.7.74 botocore-1.10.74

1

Cài đặt

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

Đầu ra mẫu:

multiprocessing
netrc
nntplib
ntpath
nturl2path
numbers
opcode
pickle
pickletools
pipes
pkgutil

1

Đây là một giải pháp mã python sẽ trả về một danh sách các mô-đun được cài đặt. Người ta có thể dễ dàng sửa đổi mã để bao gồm số phiên bản.

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

Từ vỏ

ls site-packages

Nếu điều đó không hữu ích, bạn có thể làm điều này.

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

Và xem những gì sản xuất.


thư mục gói trang web nào? Điều này có thể làm tốt hơn: ls / usr / {local /,} lib / python $ (python -V 2> & 1 | cut -d "" -f2 | cut -d. -F1-2) / site-gói
vezult

Ngoài ra, điều này sẽ không hiển thị các mô-đun tích hợp hoặc mô-đun trong PYTHONPATH tùy chỉnh hoặc các mô-đun được cài đặt trong "chế độ phát triển" của setuptools, v.v.
dF.

/Usr/local/lib/python2.5/site-packages trống, mặc dù tôi đã cài đặt các mô-đun.
Léo Léopold Hertz

14
Kudos vì đã không xóa câu trả lời bị bỏ qua này. Nó hữu ích cho cộng đồng để có thể biết tại sao một câu trả lời chung được coi là sai.
Jeremy Stein

1
@JeremyStein Một chiến lược tốt hơn (hữu ích hơn và có thể ít gây tổn hại hơn) có lẽ sẽ là chỉnh sửa câu hỏi để giải thích tại sao nó sai, một khi điều này đã được giải thích trong các bình luận ...
Kyle Strand
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.