स्ट्रिंग चर से मॉड्यूल आयात करें


182

मैं नेस्टेड matplotlib (MPL) लाइब्रेरी के लिए एक डॉक्यूमेंटेशन (व्यक्तिगत) पर काम कर रहा हूं, जो कि इच्छुक सबमॉड्यूल पैकेजों द्वारा प्रदान की गई MPL से अलग है। मैं पायथन स्क्रिप्ट लिख रहा हूं, जो मुझे उम्मीद है कि भविष्य के एमपीएल रिलीज से दस्तावेज़ पीढ़ी को स्वचालित करेगा।
मैंने इच्छुक सबमॉड्यूल्स / पैकेजों का चयन किया और उनकी मुख्य कक्षाओं को सूचीबद्ध करना चाहता हूं जिनसे मैं सूची तैयार करूंगा और इसके साथ प्रक्रिया करूंगाpydoc

समस्या यह है कि मैं पायथन को स्ट्रिंग से सबमॉड्यूल लोड करने का निर्देश देने का एक तरीका नहीं खोज सकता। यहाँ उदाहरण है कि मैंने क्या कोशिश की:

import matplotlib.text as text
x = dir(text)

i = __import__('matplotlib.text')
y = dir(i)

j = __import__('matplotlib')
z = dir(j)

और यहाँ 3 तरह की उपरोक्त सूचियों की तुलना पदचिह्न के माध्यम से की गई है:

यहां छवि विवरण दर्ज करें

मुझे समझ में नहीं आया कि yवस्तु में क्या लोड है - यह आधार matplotlibप्लस कुछ और है, लेकिन इसमें जानकारी की कमी है जो मुझे चाहिए था और matplotlib.textपैकेज से मुख्य कक्षाएं हैं । यह स्क्रीनशॉट ( xसूची) पर शीर्ष नीले रंग का हिस्सा है

कृपया अलग दृष्टिकोण के रूप में स्फिंक्स का सुझाव न दें।


क्या आप बता सकते हैं कि आपको __import__(str)मानक importस्टेटमेट के बजाय उपयोग करने की आवश्यकता क्यों है ?
थेसेमेट

ऐसा इसलिए है क्योंकि मैं सूचीबद्ध करता हूं कि कौन से आइटम एमपीएल सबमॉड्यूल्स हैं और उनके तरीके प्राप्त करते हैं
थीटा

9
@thesamet - c'mon - ऐसे अंतहीन विचार हैं जहाँ आप यह कार्यक्षमता चाहते हैं। जब आपके पास पुस्तकालयों का एक पाठ विन्यास होता है, तो आप उन्हें नाम से लोड कर सकते हैं, जो importकथन के साथ काफी काम नहीं करेगा । यहाँ उपयोग का एक उदाहरण दिया गया है: djangosnippets.org/snippets/3048
टॉमस

जवाबों:


278

__import__समारोह थोड़ा समझने के लिए मुश्किल हो सकता है।

अगर तुम बदलो

i = __import__('matplotlib.text')

सेवा

i = __import__('matplotlib.text', fromlist=[''])

तब iसंदर्भित करेगा matplotlib.text

पायथन 2.7 और पायथन 3.1 या बाद में, आप इसका उपयोग कर सकते हैं importlib:

import importlib

i = importlib.import_module("matplotlib.text")

कुछ नोट

  • यदि आप उप-फ़ोल्डर से कुछ आयात करने की कोशिश कर रहे हैं ./feature/email.py, जैसे , कोड जैसा दिखेगाimportlib.import_module("feature.email")

  • यदि आप __init__.pyउस फ़ाइल के साथ फ़ोल्डर में नहीं हैं जिसे आप आयात करने का प्रयास कर रहे हैं तो आप कुछ भी आयात नहीं कर सकते


3
importlibpyi पर <python2.7 के लिए उपलब्ध होना चाहिए
जेफरी जोस

49
किसी के लिए भी जो गूगल से यहां आ रहा है। यह ध्यान दिया जाना चाहिए कि यदि आप सब-फोल्डर से कुछ आयात करने की कोशिश कर रहे हैं (उदाहरण के लिए ./feature/email.py), तो कोड ऐसा दिखेगाimportlib.import_module("feature.email")
Seanny123

11
अंत में, यह भी याद रखें कि यदि आप उस __init__.pyफ़ाइल के साथ फ़ोल्डर में नहीं हैं जिसे आप आयात करने का प्रयास कर रहे हैं तो आप कुछ भी आयात नहीं कर सकते ।
सीनियनी

3
@mzjn यह वह जगह है import moduleNameजहां मॉड्यूलनाम स्ट्रिंग है। कैसे के बारे में from moduleName import *?
नाम जी वीयू

2
अगर किसी को इसके स्टैकओवरफ्लो की
नाम जी VU

68

importlib.import_moduleवह है जो आप ढूंढ रहे हैं। यह आयातित मॉड्यूल लौटाता है। (केवल पायथन के लिए उपलब्ध> = 2.7 या 3.x):

import importlib

mymodule = importlib.import_module('matplotlib.text')

इसके बाद आप मॉड्यूल में कुछ भी एक्सेस कर सकते हैं mymodule.myclass, आदि।


एक विकल्प मॉड्यूल का imp.load_source(..)उपयोग कर रहा impहै जैसा कि इस उत्तर में सुझाया गया है stackoverflow.com/questions/67631/…
एवगेनी सर्गेव

5
@gecco यह वह जगह है import moduleNameजहां मॉड्यूलनाम स्ट्रिंग है। कैसे के बारे में from moduleName import *?
नाम जी वीयू

6

एक सूची से मॉड्यूल आयात करने की कोशिश में कुछ समय बिताया, और यह वह धागा है जो मुझे वहां सबसे ज्यादा मिला है - लेकिन मैंने ___import____ का उपयोग नहीं किया है -

तो यहाँ एक स्ट्रिंग से एक मॉड्यूल आयात करने के लिए कैसे, और बस आयात के रूप में एक ही व्यवहार मिलता है। और त्रुटि मामले को छोड़कर / भी कोशिश करें। :)

  pipmodules = ['pycurl', 'ansible', 'bad_module_no_beer']
  for module in pipmodules:
      try:
          # because we want to import using a variable, do it this way
          module_obj = __import__(module)
          # create a global object containging our module
          globals()[module] = module_obj
      except ImportError:
          sys.stderr.write("ERROR: missing python module: " + module + "\n")
          sys.exit(1)

और हाँ, अजगर के लिए 2.7> आपके पास अन्य विकल्प हैं - लेकिन 2.6 <के लिए, यह काम करता है।


1

मैंने ये 3 उपयोगी कार्य विकसित किए हैं:

def loadModule(moduleName):
    module = None
    try:
        import sys
        del sys.modules[moduleName]
    except BaseException as err:
        pass
    try:
        import importlib
        module = importlib.import_module(moduleName)
    except BaseException as err:
        serr = str(err)
        print("Error to load the module '" + moduleName + "': " + serr)
    return module

def reloadModule(moduleName):
    module = loadModule(moduleName)
    moduleName, modulePath = str(module).replace("' from '", "||").replace("<module '", '').replace("'>", '').split("||")
    if (modulePath.endswith(".pyc")):
        import os
        os.remove(modulePath)
        module = loadModule(moduleName)
    return module

def getInstance(moduleName, param1, param2, param3):
    module = reloadModule(moduleName)
    instance = eval("module." + moduleName + "(param1, param2, param3)")
    return instance

और हर बार मैं एक नया उदाहरण पुनः लोड करना चाहता हूं मुझे बस इस तरह getInstance () कॉल करना होगा:

myInstance = getInstance("MyModule", myParam1, myParam2, myParam3)

अंत में मैं नए उदाहरण के अंदर सभी कार्यों को कॉल कर सकता हूं:

myInstance.aFunction()

यहां एकमात्र विशिष्टता आपके उदाहरण के परमेस सूची (param1, param2, param3) को अनुकूलित करना है।


1

एक स्ट्रिंग चर से एक मॉड्यूल आयात करने के लिए importlibएक का उपयोग करने के अलावा execविधि का उपयोग कर सकते हैं ।

यहाँ मैं combinationsविधि itertoolsका उपयोग करके पैकेज से विधि आयात करने का एक उदाहरण दिखा रहा हूँ exec:

MODULES = [
    ['itertools','combinations'],
]

for ITEM in MODULES:
    import_str = "from {0} import {1}".format(ITEM[0],', '.join(str(i) for i in ITEM[1:]))
    exec(import_str)

ar = list(combinations([1, 2, 3, 4], 2))
for elements in ar:
    print(elements)

आउटपुट:

(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.