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