İçe aktarılan modüller nasıl listelenir?


152

İçe aktarılan tüm modüller nasıl numaralandırılır?

Örneğin ['os', 'sys'], bu koddan almak istiyorum :

import os
import sys

Yerel Python'da mümkün olduğunu düşünmüyorum, ancak bu önceki soru yardımcı olabilir: stackoverflow.com/questions/2572582/…
— parent5446

6
Bazen (ör: ile ipython --pylab) python yorumlayıcısı önceden tanımlanmış modüller yüklendiğinde başlatılır. O_O
— yota

Yanıtlar:


182
import sys
sys.modules.keys()

Sadece mevcut modül için tüm ithalatı elde etmenin bir yaklaşımı, globals()modülleri denetlemek olacaktır :

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

Bu, yerel ithalatları veya modül olmayan ithalatları döndürmez from x import y. val.__name__Kullanıldıysa orijinal modül adını almanız için bunun geri döndüğünü unutmayın import module as alias; takma ad istiyorsanız bunun yerine isim verin.


2
Veya sys.modules'ün globallerle kesişimini bulabilir ve hiç tip testi yapamazsınız.
— Marcin

İçe aktarılan modülün adını yeniden tanımladığınızda tam modül adını döndüren tek çözüm budur. Örneğin, bunu yaparsanız import numpy as np, numpydiğer iki öneri geri dönerken bu geri döner np.
— joelostblom

1
Herhangi bir nedenle hem modül adına hem de takma ada ihtiyacınız varsa, bu namedeğişkente mevcuttur . Böylece dize üretmek için verim ifadesinin şimdi olduğu import numpy as npgibi bir şey yapın 'import %s as %s' % (val.__name__, name).
— André C. Andersen

38

Kesişimini bul sys.modulesile globals:

import sys
modulenames = set(sys.modules) & set(globals())
allmodules = [sys.modules[name] for name in modulenames]

1
Belki frozensetonun yerine burada kullanın? - İşte benim 1-liner:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
— AT

Yukarıdaki çözüm, fromkomut kullanılarak içe aktarılan modülleri çıkarmaz . Örneğin düşünün from scipy.stats import norm. Bu bana normmodülün ithal edildiğini söylemiyor . Bu buna nasıl dahil edilebilir?
— Ujjwal

@Ujjwal Bu modüller ithal edilmiyor, sadece bileşenleri. Her şeye ihtiyacınız varsa, sadece sys.modules kullanın.
— Marcin

28

Bunu komut dosyasının dışından yapmak istiyorsanız:

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)

Bu, myscript.py tarafından yüklenen tüm modülleri yazdıracaktır.


1
Python 3 için, değişim .iteritems()için .items()baskı ifadesi için ve parantez
— kakule

Not: Ad
— mPrinC

Makasın makineme 204 bağımlılığı var ... Bu garip mi, beklenen mi?
— Guimoute

12
print [key for key in locals().keys()
       if isinstance(locals()[key], type(sys)) and not key.startswith('__')]

8

diyelim ki matematik içe aktardınız ve tekrar:

>>import math,re

şimdi aynı kullanımı görmek için

>>print(dir())

İçe aktarmadan önce ve içe aktarmadan sonra çalıştırırsanız, fark görülebilir.


6

Aslında oldukça iyi çalışıyor:

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

Bu, içe aktarılabilir modül adlarına sahip bir liste oluşturur .


Bu soruya gerçekten cevap vermiyor.
— bergercookie

4

Bu kod, modülünüz tarafından içe aktarılan modülleri listeler:

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]

Tekrar tekrar denemenize gerek kalmadan, kodunuzu çalıştırmak için yeni bir sisteme hangi harici modüllerin yükleneceğini bilmek istiyorsanız yararlı olacaktır.

sysOndan içe aktarılan modülü veya modülleri listelemez .


1

@Lila'dan çalmak (biçimlendirme olmadığından yorum yapamadı), modülün / yolunu da gösterir:

#!/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()

hangi üretir:

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

.. selamlamak için uygun ya da ne var. Dikkatli olun, uzun!


0

Bu durumda bir liste kavrama kullanmayı seviyorum:

>>> [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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.