İç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
ipython --pylab) python yorumlayıcısı önceden tanımlanmış modüller yüklendiğinde başlatılır. O_O
İç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
ipython --pylab) python yorumlayıcısı önceden tanımlanmış modüller yüklendiğinde başlatılır. O_O
Yanıtlar:
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.
import numpy as np, numpydiğer iki öneri geri dönerken bu geri döner np.
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).
Kesişimini bul sys.modulesile globals:
import sys
modulenames = set(sys.modules) & set(globals())
allmodules = [sys.modules[name] for name in modulenames]
frozensetonun yerine burada kullanın? - İşte benim 1-liner:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
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?
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.
.iteritems()için .items()baskı ifadesi için ve parantez
print [key for key in locals().keys()
if isinstance(locals()[key], type(sys)) and not key.startswith('__')]
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.
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 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 .
@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!
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)