आयातित मॉड्यूल को कैसे सूचीबद्ध करें?


152

सभी आयातित मॉड्यूल की गणना कैसे करें?

जैसे मैं ['os', 'sys']इस कोड से प्राप्त करना चाहूंगा :

import os
import sys

मुझे नहीं लगता कि मूल पायथन में यह संभव है, लेकिन यह पिछला सवाल मदद कर सकता है: stackoverflow.com/questions/2572582/…
parent5446

6
कभी-कभी (पूर्व: साथ ipython --pylab) अजगर इंटरप्रेटर को पूर्वनिर्धारित मॉड्यूल लोड किए जाने के साथ लॉन्च किया जाता है। प्रश्न यह है कि कैसे पता
चले

जवाबों:


182
import sys
sys.modules.keys()

केवल वर्तमान मॉड्यूल के लिए सभी आयात प्राप्त करने का एक अनुमान मॉड्यूल के लिए निरीक्षण करना होगा globals():

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

यह स्थानीय आयात, या गैर-मॉड्यूल आयात वापस नहीं करेगा from x import y। ध्यान दें कि val.__name__यदि आप उपयोग करते हैं तो यह मूल मॉड्यूल नाम प्राप्त करता है import module as alias; यदि आप उपनाम चाहते हैं तो इसके बजाय उपज का नाम।


2
या आप ग्लोबल्स के साथ sys.modules का प्रतिच्छेदन पा सकते हैं, और किसी भी प्रकार का परीक्षण नहीं कर सकते हैं।
मार्सिन

यह एकमात्र समाधान है जो पूर्ण मॉड्यूल नाम लौटाता है जब आप अपने आयातित मॉड्यूल के नाम को फिर से परिभाषित करते हैं। उदाहरण के लिए यदि आप करते हैं import numpy as np, तो यह वापस आ जाएगा numpyजबकि अन्य दो सुझाव वापस आ जाएंगे np
joelostblom

1
यदि आपको किसी कारण से मॉड्यूल नाम और उपनाम दोनों की आवश्यकता है, तो यह nameचर में उपलब्ध है । इस प्रकार स्ट्रिंग उत्पन्न करने के import numpy as npलिए कुछ ऐसा करें 'import %s as %s' % (val.__name__, name)जहां उपज कथन अब है।
एंड्रे सी। एंडरसन

38

के चौराहे का पता लगाएं sys.modulesके साथ globals:

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

1
शायद frozensetयहाँ के बजाय का उपयोग करें? - यहाँ मेरा 1-लाइनर है:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
एटी

उपरोक्त समाधान उन मॉड्यूल को नहीं निकालता है जिन्हें fromकमांड का उपयोग करके आयात किया जा रहा है । उदाहरण के लिए विचार करें from scipy.stats import norm। यह मुझे नहीं बताता कि normमॉड्यूल आयात किया गया है। इसमें कैसे शामिल किया जा सकता है?
उज्जवल

@ उज्जवल, उन मॉड्यूलों को आयात नहीं किया जा रहा है, बस उनके घटक हैं। यदि आपको सब कुछ चाहिए, तो बस sys.modules का उपयोग करें।
मार्सिन

28

यदि आप स्क्रिप्ट के बाहर से ऐसा करना चाहते हैं:

अजगर २

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

अजगर ३

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

यह myscript.py द्वारा लोड किए गए सभी मॉड्यूल को प्रिंट करेगा।


1
पायथन 3 के लिए, प्रिंट स्टेटमेंट के लिए और ब्रैकेट में बदलाव .iteritems()करें.items()
इलायची

नोट: जब आप नाम स्थान के साथ काम कर रहे हैं तो यह दुर्घटनाग्रस्त हो जाता है: bugs.python.org/issue40350
mPrinC

इस स्निप में मेरे मशीन पर 204 निर्भरताएँ हैं ... क्या यह अजीब है या अपेक्षित है?
Guimoute


8

मान लें कि आपने गणित और पुनः आयात किया है:

>>import math,re

अब उसी उपयोग को देखने के लिए

>>print(dir())

यदि आप इसे आयात से पहले और आयात के बाद चलाते हैं, तो कोई अंतर देख सकता है।


6

यह वास्तव में के साथ काफी अच्छा काम कर रहा है:

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

यह आयात योग्य मॉड्यूल नामों के साथ एक सूची बनाएगा ।


यह वास्तव में सवाल का जवाब नहीं है।
18 नवंबर को bergercookie

4

यह कोड आपके मॉड्यूल द्वारा आयातित मॉड्यूल को सूचीबद्ध करता है:

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]

यह उपयोगी होना चाहिए, यदि आप जानना चाहते हैं कि आपके कोड को चलाने के लिए एक नए सिस्टम पर कौन से बाहरी मॉड्यूल स्थापित करने की आवश्यकता है, बिना बार-बार प्रयास करने की आवश्यकता है।

यह उस sysमॉड्यूल या मॉड्यूल को सूचीबद्ध नहीं करेगा जो उससे आयात किया गया है।


1

@ लीला से चोरी (बिना किसी प्रारूपण के कारण टिप्पणी नहीं कर सकता), यह मॉड्यूल के पथ / मार्ग को दिखाता है:

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

जो पैदा करता है:

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

.. आप क्या है के लिए उपयुक्त या मनोरंजक। चेतावनी दी है, यह लंबा है!


0

मुझे इस मामले में सूची समझ का उपयोग करना पसंद है:

>>> [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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.