Bagaimana saya bisa mendapatkan daftar modul Python yang dipasang secara lokal?


998

Saya ingin mendapatkan daftar modul Python, yang ada di instalasi Python saya (server UNIX).

Bagaimana Anda bisa mendapatkan daftar modul Python yang diinstal di komputer Anda?


77
Anda bisa melakukan >>> help () dan kemudian >>> modules
Julius Naeumann

1
Apakah ada alternatif? help () hang untuk saya.
Paulo Carvalho

2
Banyak dari jawaban ini menganggap Anda memiliki akses ke baris perintah. Jika Anda menggunakan AWS Lambda, Anda harus melakukan semuanya dari dalam Python. Lihat stackoverflow.com/a/54939905/117471
Bruno Bronosky

Jawaban:


610

Larutan

Jangan gunakan dengan pip> 10.0!

50 sen saya untuk mendapatkan pip freezedaftar seperti dari skrip 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)

Sebagai satu liner (terlalu panjang):

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

Memberi:

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

Cakupan

Solusi ini berlaku untuk ruang lingkup sistem atau ruang lingkup lingkungan virtual, dan mencakup paket-paket yang diinstal oleh setuptools, pipdan ( allah dilarang ) easy_install.

Kasus penggunaan saya

Saya menambahkan hasil panggilan ini ke server labu saya, jadi ketika saya memanggilnya dengan http://example.com/exampleServer/environmentsaya mendapatkan daftar paket yang diinstal pada virtualenv server. Itu membuat debugging jauh lebih mudah.

Peringatan

Saya telah memperhatikan perilaku aneh teknik ini - ketika interpreter Python dipanggil dalam direktori yang sama dengan setup.pyfile, itu tidak mencantumkan paket yang diinstal oleh setup.py.

Langkah-langkah mereproduksi:

Buat lingkungan virtual
$ cd /tmp
$ virtualenv test_env
New python executable in test_env/bin/python
Installing setuptools, pip...done.
$ source test_env/bin/activate
(test_env) $ 
Mengkloning git repo dengan 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.

Kami memiliki perilaku setup.pydi /tmp/behave:

(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
Instal paket python dari 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

Jika kami menjalankan solusi tersebut dari /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'

Jika kami menjalankan solusi tersebut dari /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.5a1hilang dari contoh kedua, karena direktori kerja mengandung behave's setup.pyberkas.

Saya tidak dapat menemukan referensi untuk masalah ini dalam dokumentasi. Mungkin saya akan membuka bug untuk itu.


5
Terima kasih atas jawaban ini! Saya pikir lebih baik menjawab pertanyaan karena saya bertanya "secara lokal" menginstal modul Python. Membekukan pip juga tidak selalu merupakan jalan yang harus ditempuh. Ini berfungsi lebih baik - saya pikir.
Léo Léopold Hertz 준영

3
@Masi Baru saja menambahkan penjelasan rinci tentang peringatan dari solusi ini. Ini memang aneh.
Adam Matan

21
Alternatif:import pkg_resources; installed_packages = [(d.project_name, d.version) for d in pkg_resources.working_set]
ebolyen

14
Mulai pip 10, jawaban ini tidak akan berfungsi lagi. Komentar dari @ebolyen menunjukkan perintah alternatif yang berfungsi. Saya sampai pada kesimpulan yang sama dan memposting kode revisi lengkap di bawah ini.
Big_Al_Tx

5
Di versi pip terbaru, ini tidak akan berfungsi, menghasilkan pesan kesalahan yang mengatakan AttributeError: module 'pip' has no attribute 'get_installed_distributions'.
HelloGoodbye

1040
help('modules')

dalam shell Python / prompt.


10
@dF pydoc modulesberfungsi. Anda harus mengirimkannya sebagai jawaban.
Abizern

37
Beri aku kesalahan seg!
zanbri

3
nobar, zanbri, @Joe Frambach: di Ubuntu? Ada bug yang dijelaskan di sini: bugs.launchpad.net/ubuntu/+source/python2.7/+bug/896836
ChristopheD

2
bagaimana saya bisa mendapatkan info tambahan tentang di mana modul dipasang dan apa versi saat ini?
penasaran

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

285

Sekarang, metode ini saya coba sendiri, dan saya mendapatkan apa yang diiklankan: Semua modul.

Sayangnya, sungguh Anda tidak terlalu peduli dengan stdlib, Anda tahu apa yang Anda dapatkan dengan instalasi python.

Sungguh, saya ingin barang yang saya instal.

Apa yang sebenarnya, secara mengejutkan, bekerja dengan baik adalah:

pip freeze

Yang dikembalikan:

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

Saya mengatakan "secara mengejutkan" karena alat instal paket adalah tempat yang tepat yang diharapkan untuk menemukan fungsionalitas ini, walaupun tidak dengan nama 'beku' tetapi kemasan python sangat aneh, sehingga saya terperangah bahwa alat ini masuk akal. Pip 0.8.2, Python 2.7.


4
Saya kira ide di balik namanya adalah bahwa Anda mendapatkan snapshot "beku" dari apa yang diinstal sekarang, yang nantinya dapat Anda masukkan kembali ke pip untuk mendapatkan modul yang sama persis yang diinstal di lingkungan yang berbeda.
Ryan C. Thompson

Arash, Anda dapat menginstal pip di Windows juga! Pertama instal setuptools dan kemudian gunakan easy_install untuk menginstal pip :)
gawbul

Ini luar biasa, tetapi sepertinya melewatkan beberapa perpustakaan yang saya instal. Misalnya, itu tidak mencantumkan PyQt.
Junuxx

8
Mulai dari pip 1.3 ada perintah daftar .
Piotr Dobrogost

berhasil. Apa python berantakan itu. Mengapa mereka tidak dapat melakukan tindakan bersama dan menghasilkan solusi yang mirip dengan yang ada di Rails? (Gemfile, bundler, rvm)
Dimitris

106

Sejak pip versi 1.3, Anda memiliki akses ke:

pip list

Yang tampaknya menjadi gula sintaksis untuk "pip freeze". Ini akan mendaftar semua modul khusus untuk instalasi Anda atau virtualenv, bersama dengan nomor versi mereka. Sayangnya itu tidak menampilkan nomor versi modul apa pun saat ini, juga tidak mencuci piring atau menyemir sepatu Anda.


4
Ada juga pip list --localuntuk membedakan antara virtualenvpaket situs global dan, dibahas di sini .
Ioannis Filippidis

1
Sejauh ini yang terbaik. Itu juga mengambil versi.
aerijman

pip listadalah yang paling sederhana dan terbaik. Berikut adalah opsi dan detailnya.
Levi Baguley

86
  • Di dalam ipythonAnda dapat mengetik " importTab".

  • Dalam juru bahasa Python standar, Anda bisa mengetikkan " help('modules')".

  • Di baris perintah, Anda bisa menggunakan .pydoc modules

  • Dalam sebuah skrip, panggil pkgutil.iter_modules().


5
pkgutil.iter_modules()berfungsi, solusi pip di atas tidak mencantumkan semua paket, hanya yang diinstal melalui pip.
metaperture

2
Luar biasa! Saya pikir mereka telah meningkatkan dokumentasi, sejak pertanyaan diajukan. pydoc modules spam mencari spam di docs of modules. Poin terakhir tampaknya memberi Anda informasi yang cukup untuk menggunakan modul. @metaperture Dapatkah Anda, tolong, berikan contoh bagaimana Anda mendaftar semua modul lokal yang diinstal (bukan daftar besar stlib dengan bantuan ('modul')) oleh pkgutil.iter_modules () .
Léo Léopold Hertz 준영

2
@ LéoLéopoldHertz 준영 Coba potongan ini: python -c 'import pkgutil;print [x[1] for x in list(pkgutil.iter_modules())]'. Seharusnya membuang semua nama modul sebagai satu daftar Python yang sangat besar. The x[1]bit digunakan untuk memetik nama modul dari tuple yang dihasilkan oleh pkgutil.iter_modules().
Philip Conrad

76

Saya hanya menggunakan ini untuk melihat modul yang sedang digunakan:

import sys as s
s.modules.keys()

yang menunjukkan semua modul berjalan di python Anda.

Untuk semua modul bawaan gunakan:

s.modules

Yaitu dict yang berisi semua modul dan objek impor.


2
# Setelah Anda mengimpor sys "import sys as s" Anda dapat mencetak dengan: print sys.modules.keys ()
Dan Evans

Tidak yakin mengapa posting saya diedit, tetapi terima kasih telah menggunakan info yang saya posting untuk memperbaiki kesalahan pada posting sebelumnya. Anda akan mengembalikan kesalahan jika Anda menggunakan bantuan () vs bantuan (''). Ini berlaku untuk dir ('') & sys ('') dll. Semoga ini bisa membantu & tidak dihapus.
Dan Evans

Abaikan posting terakhir saya, posting ini tidak diedit. Saya sedang memikirkan posting serupa yang ditemukan di sini: stackoverflow.com/questions/139180/... Maaf atas kebingungannya.
Dan Evans

7
Terpilih, karena ini adalah satu-satunya metode yang tampaknya bekerja pada sistem terbatas yang tidak memiliki pydocatau pipmenginstal (NAS dalam kasus saya).
Thomas

1
Setuju dengan Thomas. Saya menggunakan repl.it, misalnya, yang juga merupakan tipe lingkungan terbatas. help('modules')hanya hang tanpa respons untukku. Tetapi pendekatan ini sysbekerja dengan sempurna
Sergiy Kolodyazhnyy

63

Dalam shell biasa gunakan saja

pydoc modules

Tampaknya di atas hanya berfungsi pada platform nix. Bagaimanapun, saya menemukan dan menjalankan skrip, mengadaptasi perintah sebagai berikut: c: \ bin \ pythos_2.7 \ lib \ pydoc.py modul - daftar itu membutuhkan waktu lama untuk dibangun, formatnya payah, dan ia menghilangkan versi yang diinstal jumlah. Saya akan lewat.
David A. Gray

2
@ DavidA.Gray Baru saja mencoba ini pada mesin Windows dengan Python 3, dan ternyata berfungsi. Menggunakan peluncur jendela python yang dapat Anda lakukan py -m pydoc modulesdalam cmd atau Powershell.
VKK

pydoc modulestidak bekerja untuk saya di Windows 10 dengan Python 3.6, tetapi modifikasi @VKK: py -m pydoc modulestidak bekerja di cmd / Powershell.
Martin

41

Pada pip 10, jawaban yang diterima tidak akan berfungsi lagi. Tim pengembangan telah menghapus akses ke get_installed_distributionsrutinitas. Ada fungsi alternatif dalam setuptoolsuntuk melakukan hal yang sama. Berikut ini adalah versi alternatif yang berfungsi dengan 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)

Tolong beri tahu saya jika itu juga akan atau tidak berfungsi di versi sebelumnya dari pip.


2
Saya telah mencari solusi ini dan menghancurkan otak saya mencoba mencari tahu pkg_resources. Jika saya bisa memperbaiki ini lebih dari sekali saya akan. Terima kasih, @Big_Al_Tx! Pembaruan: Kecuali .... ketika saya melakukan 'pembekuan pipa' di lingkungan virtual saya dan membandingkannya dengan output ini, ada paket yang hilang. Adakah pemikiran mengapa hal itu bisa / akan terjadi?
numberwhun

@numberwhun - Saya senang ini berhasil untuk Anda. Maaf, tapi saya tidak punya jawaban untuk perbedaan dengan pip freeze; kedalaman pengetahuan saya tentang topik ini agak terbatas. Saya agak meraba-raba mencari solusi ketika jawaban yang diterima tidak bekerja untuk saya dan saya mencoba menggabungkannya dengan jawaban yang terkait setuptoolsdan membuatnya bekerja.
Big_Al_Tx

github.com/pypa/pip/issues/5243 - Pembicaraan tim pengembangan tentang penghapusan akses ke get_installed_distributions routine.
bl79

@ bl79 - Saya pikir itu adalah tempat yang tepat di mana saya mendapat referensi setuptools.
Big_Al_Tx

@Big_Al_Tx: Yah, saya semacam bekerja di sekitar opsi setuptools (yang waaaay dikaburkan untuk kebutuhan saya) dan saya pergi dengan ini: install_pkgs = subprocess.check_output (['pip', 'freeze']) Itu melakukan apa yang saya lakukan membutuhkannya untuk melakukan .... Yay !!
numberwhun

26

Jika kita perlu mendaftar paket yang diinstal di shell Python, kita dapat menggunakan helpperintah sebagai berikut

>>help('modules package')

22

Saya biasanya menggunakan pip listuntuk mendapatkan daftar paket (dengan versi).

Ini bekerja di lingkungan virtual juga, tentu saja. Untuk menunjukkan apa yang diinstal hanya dalam lingkungan virtual (bukan paket global), gunakan pip list --local.

Berikut dokumentasi yang menunjukkan semua pip listopsi yang tersedia , dengan beberapa contoh bagus.


13

Pencarian sangat sederhana menggunakan 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]

apakah ada alasan untuk menggunakan while daripada for loop? Saya menulis menggunakan for m in iter_modules()dan itu berhasil juga.
Joao Ponte

13

di windows, Masukkan ini dalam cmd

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

Ini bekerja untuk saya menggunakan: python3 -m pip freeze - for python 3.5.3.
dpminusa

Ini berfungsi dengan baik dan Anda tidak perlu berada di direktori libs juga jika variabel Anda didefinisikan
mcy

12

Saya bertemu dengan python 2.7 yang diinstal khusus pada OS X. Diperlukan X11 untuk mendaftar modul yang diinstal (keduanya menggunakan bantuan dan pydoc).

Untuk dapat mendaftar semua modul tanpa menginstal X11 saya menjalankan pydoc sebagai http-server, yaitu:

pydoc -p 12345

Maka mungkin untuk mengarahkan Safari http://localhost:12345/untuk melihat semua modul.



12

Ini akan membantu

Di terminal atau IPython, ketik:

help('modules')

kemudian

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

Ini harus menjadi jawaban yang diterima! Satu baris :)
AlmostPitt

9

Solusi ini primer berdasarkan pada modul importlibdan pkgutildan bekerja dengan CPython 3.4 dan CPython 3.5, tetapi tidak memiliki dukungan untuk CPython 2.


Penjelasan

  1. sys.builtin_module_names- beri nama semua modul bawaan (lihat jawaban saya di sini )
  2. pkgutil.iter_modules() - mengembalikan informasi tentang semua modul yang tersedia
  3. importlib.util.find_spec() - mengembalikan informasi tentang mengimpor modul, jika ada
  4. BuiltinImporter- importir untuk modul bawaan ( dokumen )
  5. SourceFileLoader- importir untuk modul Python standar (secara default memiliki ekstensi * .py) ( docs )
  6. ExtensionFileLoader- importir untuk modul sebagai pustaka bersama (ditulis pada C atau C ++)

Kode lengkap

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

Pemakaian

Untuk CPython3.5 (terpotong)

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

Untuk CPython3.4 (terpotong)

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

Bisakah Anda membandingkan pendekatan Anda dengan pendekatan Adam di sini stackoverflow.com/a/23885252/54964
Léo Léopold Hertz 준영

@ Léo Léopold Hertz, mengapa Anda membutuhkannya?
PADYMKO

Untuk memahami bagaimana pendekatan Anda lebih baik / lebih buruk daripada pendekatan Adam.
Léo Léopold Hertz 준영

1
@ Léo Léopold Hertz. Jawaban singkat: coba sendiri dalam produksi dan menarik kesimpulan sendiri. Jawaban panjang: pendekatan Adam didasarkan pada pip- sistem manajemen paket yang digunakan untuk menginstal dan mengelola paket perangkat lunak yang ditulis dengan Python dan hasilnya pip.get_installed_distributions()mengembalikan modul yang diinstal dengan pip. Jawaban saya sepenuhnya didasarkan pada pustaka standar Python dan mencakup semua modul yang tersedia untuk impor. Kelemahan terbesar jawaban saya - tidak ada dukungan untuk CPython 2.
PADYMKO

1
@ Léo Léopold Hertz Anda salah, ia melakukannya. Saya mengujinya di komputer saya. Jawaban saya mengandung makna khusus **truncated**, di mana output terpotong. Mungkin Anda tidak hati-hati, tetapi jika tidak, maka untuk mengirim saya informasi tentang sistem Anda dan implementasi Python, saya akan membuat riset tambahan untuk memperbaikinya.
PADYMKO

9

Peringatan: Adam Matan tidak menyarankan penggunaan ini dalam pip> 10.0. Juga, baca komentar @ sinoroc di bawah ini

Ini diilhami oleh jawaban Adam Matan (yang diterima):

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

yang kemudian mencetak tabel dalam bentuk

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

yang memungkinkan Anda dengan mudah membedakan paket mana yang Anda instal dengan dan tanpa sudo.


Catatan samping: Saya perhatikan ketika saya menginstal paket sekali melalui sudo dan sekali tanpa, satu diutamakan sehingga yang lain tidak terdaftar (hanya satu lokasi ditampilkan). Saya percaya bahwa hanya yang ada di direktori lokal yang terdaftar. Ini bisa diperbaiki.


1
Tidak. Ini tidak disarankan, lihat di sini: pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program
sinoroc

1
@ sinoroc Terima kasih telah menunjukkan ini. Poin 1 hingga 3 tampaknya tidak berlaku untuk solusi ini, karena skrip ini memiliki tujuan tunggal untuk menggunakan pipsekali dan kemudian keluar. Tampaknya lebih dari masalah yang bisa berubah perilaku.
Daniel F

Setuju, alasan mengapa tidak ada API publik tidak berlaku untuk bagian kode tertentu ini. Tetapi karena pip tidak terikat untuk menjamin API publik, ia bebas untuk mengubah API internal, struktur kode, dll. Dalam rilis nanti, seperti yang sudah dilakukan sebelumnya. Inilah sebabnya mengapa kode ini memiliki coba / kecuali, untuk menangkap reorganisasi kode internal sebelumnya yang dimaksudkan untuk memperjelas bahwa API internal adalah API internal, bukan API publik ( _internal). Semua dalam semua, itu jelas bekerja tetapi merupakan praktik yang buruk. Ada alternatif yang lebih baik, ada yang di jawaban lain untuk pertanyaan ini.
sinoroc

1
skrip ini tidak akan berfungsi jika modul "pip" tidak ada.
Alexander Stohr


6

Jika Anda memiliki distribusi python anaconda diinstal, Anda juga bisa menggunakan

$conda list

selain solusi yang dijelaskan di atas.


Di mana / bagaimana Anda menjalankan baris ini?
HuckIt

Jika Anda menggunakan mesin UNIX / Mac OS X Anda, buka terminal Anda dan ketik saja conda install, itu akan bekerja :)
Shreyas

Saya menggunakan mesin Windows 7. Sebenarnya saya menemukannya di jalur saya, tetapi conda.exe ada di Skrip AppData \ Local \ Continuum \ Anaconda \.
HuckIt

6
  1. untuk mendapatkan semua modul yang tersedia, jalankan sys.modules
  2. untuk mendapatkan semua modul yang terpasang (baca: dipasang oleh pip), Anda dapat melihatnyapip.get_installed_distributions()

Untuk tujuan kedua, contoh kode:

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

Perintah sys.modules tidak berfungsi di Python OSX terbaru. NameError: nama 'sistem' tidak didefinisikan .
Léo Léopold Hertz 준영

@Masi Apakah maksud Anda /usr/bin/pythonatau yang berasal dari python.org ? Untuk yang pertama, saya bisa menggunakan sys.modulestanpa masalah.
yegle

Maksud saya / usr / bin / python .
Léo Léopold Hertz 준영

@Masi Tidak yakin apakah Anda masih tertarik dengan masalah ini. Rupanya Anda menggunakan system.modulesbukan sys.modules.
yegle

Lol. Kesalahan saya adalah saya awalnya tidak mengimpor sys -paket. Jadi menjalankan bukan mengimpor sistem; sys.modules bekerja seperti yang diharapkan.
Léo Léopold Hertz 준영

6

Untuk Versi Terbaru Seperti Pip 20

Jalankan yang berikut ini di editor python atau IPython Anda

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

Baca jawaban lain dan kumpulkan kombinasi ini, yang tercepat dan termudah di dalam Python


4

pip freeze tidak semuanya menemukan paket namun seseorang dapat dengan mudah menulis perintah berikut untuk mendaftar semua path di mana paket python berada.

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

4

Ada banyak cara untuk menguliti kucing.

  • Cara paling sederhana adalah dengan menggunakan pydocfungsi langsung dari shell dengan:
    pydoc modules

  • Tetapi untuk informasi lebih lanjut gunakan alat yang disebut pip-date yang juga memberi tahu Anda tanggal pemasangan.
    pip install pip-date


masukkan deskripsi gambar di sini


3

Ada banyak ide, awalnya saya merenungkan dua hal ini:

pip

kontra: tidak selalu diinstal

bantuan ('modul')

kontra: keluaran ke konsol; dengan modul yang rusak (lihat ubuntu ...) dapat melakukan segmentasi

Saya membutuhkan pendekatan yang mudah, menggunakan perpustakaan dasar dan kompatibel dengan python 2.x lama

Dan saya melihat cahaya: listmodules.py

Tersembunyi di direktori sumber dokumentasi di 2.5 adalah skrip kecil yang mencantumkan semua modul yang tersedia untuk instalasi Python.

Pro:

hanya menggunakan imp, sys, os, re, time

dirancang untuk berjalan di Python 1.5.2 dan yang lebih baru

kode sumbernya benar-benar ringkas, sehingga Anda dapat bermain-main dengan mudah, misalnya untuk melewatkan daftar pengecualian modul kereta (jangan coba mengimpornya)


3

Saya perlu menemukan versi spesifik paket yang tersedia secara default di AWS Lambda. Saya melakukannya dengan banyak ide dari halaman ini. Saya membagikannya untuk anak cucu.

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

Apa yang saya temukan adalah bahwa perpustakaan boto3 yang disediakan sudah ketinggalan zaman dan bukan salah saya bahwa kode saya gagal. Saya hanya perlu menambahkan boto3 dan botocore ke proyek saya. Tetapi tanpa ini saya akan membenturkan kepala saya berpikir kode saya buruk.

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

Apa yang saya temukan juga berbeda dari apa yang mereka terbitkan secara resmi . Pada saat penulisan ini:

  • Sistem operasi - Amazon Linux
  • AMI - amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2
  • Kernel Linux - 4.14.77-70.59.amzn1.x86_64
  • AWS SDK untuk JavaScript - 2.290.0 \
  • SDK untuk Python (Boto 3) - 3-1.7.74 botocore-1.10.74

1

Instalasi

pip install pkgutil

Kode

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

Output sampel:

multiprocessing
netrc
nntplib
ntpath
nturl2path
numbers
opcode
pickle
pickletools
pipes
pkgutil

1

Berikut ini adalah solusi kode python yang akan mengembalikan daftar modul yang diinstal. Seseorang dapat dengan mudah memodifikasi kode untuk memasukkan nomor versi.

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

Dari cangkang

ls site-packages

Jika itu tidak membantu, Anda bisa melakukan ini.

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

Dan lihat apa yang menghasilkan.


direktori paket situs mana? Ini mungkin lebih baik: ls / usr / {local /,} lib / python $ (python -V 2> & 1 | cut -d "" -f2 | cut -d. -F1-2) / paket-situs
vezult

Ini juga tidak akan menampilkan modul bawaan, atau modul dalam PYTHONPATH khusus, atau yang dipasang di setuptools "mode pengembangan" dll.
dF.

/Usr/local/lib/python2.5/site-package saya kosong, walaupun saya sudah menginstal modul.
Léo Léopold Hertz 준영

14
Kudos karena tidak menghapus jawaban yang diturunkan ini. Sangat membantu komunitas untuk dapat melihat mengapa jawaban umum dianggap salah.
Jeremy Stein

1
@JeremyStein Strategi yang lebih baik (lebih bermanfaat dan mungkin lebih sedikit merusak) mungkin akan mengedit pertanyaan untuk menjelaskan mengapa itu salah, setelah ini dijelaskan dalam komentar ...
Kyle Strand
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.