Bagaimana cara mendaftar modul yang diimpor?

152

Bagaimana cara menghitung semua modul yang diimpor?

Misalnya saya ingin dapatkan ['os', 'sys']dari kode ini:

import os
import sys
alex2k8
sumber
Saya tidak berpikir itu mungkin dalam Python asli, tetapi pertanyaan sebelumnya ini mungkin membantu: stackoverflow.com/questions/2572582/…
parent5446
6
Kadang-kadang (ex: with ipython --pylab) python interpreter diluncurkan dengan modul yang telah ditentukan dimuat. Masih ada pertanyaan, bagaimana cara mengetahui alias yang digunakan o_O
yota

Jawaban:

182
import sys
sys.modules.keys()

Perkiraan mendapatkan semua impor untuk modul saat ini hanya akan memeriksa globals()modul:

import types
def imports():
    for name, val in globals().items():
        if isinstance(val, types.ModuleType):
            yield val.__name__

Ini tidak akan mengembalikan impor lokal, atau impor non-modul suka from x import y. Perhatikan bahwa ini mengembalikan val.__name__sehingga Anda mendapatkan nama modul asli jika Anda menggunakan import module as alias; ganti nama jika Anda ingin alias.

Glenn Maynard
sumber
2
Atau Anda bisa menemukan persimpangan sys.modules dengan global, dan tidak melakukan pengujian tipe sama sekali.
Marcin
Ini adalah satu-satunya solusi yang mengembalikan nama modul lengkap ketika Anda mendefinisikan kembali nama modul yang diimpor. Misalnya, jika Anda melakukannya import numpy as np, ini akan kembali numpysementara dua saran lainnya akan kembali np.
joelostblom
1
Jika Anda karena suatu alasan memerlukan nama modul dan alias, ini tersedia dalam namevariabel. Jadi untuk menghasilkan string import numpy as nplakukan sesuatu seperti di 'import %s as %s' % (val.__name__, name)mana pernyataan hasil sekarang.
André C. Andersen
38

Temukan persimpangan sys.modulesdengan globals:

import sys
modulenames = set(sys.modules) & set(globals())
allmodules = [sys.modules[name] for name in modulenames]
Marcin
sumber
1
Mungkin menggunakan di frozensetsini saja? - Ini 1-liner saya:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
PADA
Solusi di atas tidak mengekstrak modul yang sedang diimpor menggunakan fromperintah. Sebagai contoh pertimbangkan from scipy.stats import norm. Ini tidak memberi tahu saya bahwa normmodul diimpor. Bagaimana itu bisa dimasukkan ke dalam ini?
Ujjwal
@ Ujjwal Yah, modul-modul itu tidak diimpor, hanya komponen-komponennya. Jika Anda membutuhkan semuanya, gunakan saja sys.modules.
Marcin
28

Jika Anda ingin melakukan ini dari luar skrip:

Python 2

from modulefinder import ModuleFinder
finder = ModuleFinder()
finder.run_script("myscript.py")
for name, mod in finder.modules.iteritems():
    print name

Python 3

from modulefinder import ModuleFinder
finder = ModuleFinder()
finder.run_script("myscript.py")
for name, mod in finder.modules.items():
    print(name)

Ini akan mencetak semua modul yang dimuat oleh myscript.py.

Lila
sumber
1
Untuk Python 3, ganti .iteritems()ke .items()dan kurung untuk pernyataan cetak
cardamom
Catatan: Ini macet ketika Anda berurusan dengan namespace: bugs.python.org/issue40350
mPrinC
Potongan ini sendiri memiliki 204 ketergantungan pada mesin saya ... Apakah itu aneh atau diharapkan?
Guimoute
12
print [key for key in locals().keys()
       if isinstance(locals()[key], type(sys)) and not key.startswith('__')]
Mike Axiak
sumber
8

katakanlah Anda telah mengimpor matematika dan ulang:

>>import math,re

sekarang untuk melihat penggunaan yang sama

>>print(dir())

Jika Anda menjalankannya sebelum impor dan setelah impor, orang dapat melihat perbedaannya.

mukundha reddy
sumber
6

Ini sebenarnya bekerja cukup baik dengan:

import sys
mods = [m.__name__ for m in sys.modules.values() if m]

Ini akan membuat daftar dengan nama modul yang dapat diimpor .

fabiand
sumber
Itu tidak benar-benar menjawab pertanyaan.
bergercookie
4

Kode ini mencantumkan modul yang diimpor oleh modul Anda:

import sys
before = [str(m) for m in sys.modules]
import my_module
after = [str(m) for m in sys.modules]
print [m for m in after if not m in before]

Ini harus bermanfaat jika Anda ingin tahu modul eksternal apa yang harus diinstal pada sistem baru untuk menjalankan kode Anda, tanpa perlu mencoba lagi dan lagi.

Itu tidak akan mencantumkan sysmodul atau modul yang diimpor darinya.

Ohad Cohen
sumber
1

Mencuri dari @Lila (tidak dapat memberikan komentar karena tidak ada format), ini menunjukkan modul / path /, juga:

#!/usr/bin/env python
import sys
from modulefinder import ModuleFinder
finder = ModuleFinder()
# Pass the name of the python file of interest
finder.run_script(sys.argv[1])
# This is what's different from @Lila's script
finder.report()

yang menghasilkan:

Name                      File
----                      ----

...
m token                     /opt/rh/rh-python35/root/usr/lib64/python3.5/token.py
m tokenize                  /opt/rh/rh-python35/root/usr/lib64/python3.5/tokenize.py
m traceback                 /opt/rh/rh-python35/root/usr/lib64/python3.5/traceback.py
...

.. cocok untuk grepping atau apa saja. Diperingatkan, ini panjang!

JDonner
sumber
0

Saya suka menggunakan pemahaman daftar dalam hal ini:

>>> [w for w in dir() if w == 'datetime' or w == 'sqlite3']
['datetime', 'sqlite3']

# To count modules of interest...
>>> count = [w for w in dir() if w == 'datetime' or w == 'sqlite3']
>>> len(count)
2

# To count all installed modules...
>>> count = dir()
>>> len(count)
Dex
sumber