স্ট্রিং ভেরিয়েবল থেকে আমদানি মডিউল


182

আমি নেস্টেড ম্যাটপ্ল্লিটিব (এমপিএল) লাইব্রেরির জন্য একটি ডকুমেন্টেশন (ব্যক্তিগত) নিয়ে কাজ করছি যা আগ্রহী সাবমডিউল প্যাকেজগুলির দ্বারা এমপিএল নিজস্ব প্রদত্ত পৃথক পৃথক। আমি পাইথন স্ক্রিপ্টটি লিখছি যা আমি আশা করি ভবিষ্যতের এমপিএল রিলিজ থেকে ডকুমেন্ট জেনারেশনটি স্বয়ংক্রিয় করবে।
আমি আগ্রহী সাবমডিউল / প্যাকেজগুলি নির্বাচন করেছি এবং তাদের প্রধান ক্লাসগুলির তালিকা তৈরি করতে চাই যা থেকে আমি তালিকা তৈরি করব এবং এটি দিয়ে প্রক্রিয়া করবpydoc

সমস্যাটি হ'ল আমি পাইথনকে স্ট্রিং থেকে সাবমোডুল লোড করার নির্দেশ দেওয়ার কোনও উপায় খুঁজে পাই না। আমি যা চেষ্টা করেছি তার উদাহরণ এখানে:

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

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

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

এবং এখানে উপরের তালিকার তিনটি উপায়ে প্রিন্টের মাধ্যমে তুলনা করা হচ্ছে:

এখানে চিত্র বর্ণনা লিখুন

আমি বুঝতে পারি না কী yবস্তুতে লোড করা হয়েছে - এটি বেস matplotlibপ্লাস অন্য কিছু, তবে এর মধ্যে আমার যে তথ্যটি চেয়েছিল সেগুলির অভাব রয়েছে এবং এটি matplotlib.textপ্যাকেজ থেকে প্রধান ক্লাস । এটি স্ক্রিনশটের শীর্ষ নীল রঙের অংশ ( xতালিকা)

দয়া করে স্পিঙ্কসকে আলাদা পদ্ধতির হিসাবে পরামর্শ করবেন না।


আপনি __import__(str)স্ট্যান্ডার্ড importস্টেটমেটনের পরিবর্তে কেন ব্যবহারের প্রয়োজন তা ব্যাখ্যা করতে পারেন ?
থিসেমেট

এর কারণ, আমি কোন আইটেমি এমপিএল সাবমোডিয়ুলগুলি তালিকা তৈরি করব এবং তাদের পদ্ধতিগুলি পাবো
থেইটা

9
@ থেসামেট - ক্যামন - এমন অন্তহীন ধারণা রয়েছে যেখানে আপনি এই কার্যকারিতাটি চান। আপনার যখন গ্রন্থাগারগুলির একটি পাঠ্য কনফিগারেশন থাকে আপনি নাম দ্বারা এগুলি লোড করতে পারেন, যা importবিবৃতিতে বেশ কার্যকর হবে না । এখানে ব্যবহারের একটি উদাহরণ এখানে দেওয়া হয়েছে: djangosnippets.org/snippets/3048
টমাসজ গ্যান্ডার

উত্তর:


278

__import__ফাংশন একটু বোঝা কঠিন হতে পারে।

আপনি যদি পরিবর্তন

i = __import__('matplotlib.text')

প্রতি

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

তাহলে iউল্লেখ করা হবে matplotlib.text

পাইথন ২.7 এবং পাইথন ৩.১ বা তার পরে, আপনি ব্যবহার করতে পারেন importlib:

import importlib

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

কিছু নোট

  • আপনি যদি একটি সাব-ফোল্ডার থেকে কিছু আমদানি করার চেষ্টা করছেন যেমন ./feature/email.py, কোডটি দেখতে পাবেনimportlib.import_module("feature.email")

  • আপনি যে __init__.pyফাইলটি আমদানি করার চেষ্টা করছেন তার ফোল্ডারে যদি কিছু না থাকে তবে আপনি কোনও কিছু আমদানি করতে পারবেন না


3
importlib<পাইথন ২..7
জেফ্রি জোসে

49
গুগল থেকে যে কেউ এখানে আসছেন For এটি লক্ষ করা উচিত যে আপনি যদি একটি সাব-ফোল্ডার (উদাহরণস্বরূপ ./feature/email.py) থেকে কিছু আমদানি করার চেষ্টা করছেন তবে কোডটি দেখতে পাবেনimportlib.import_module("feature.email")
Seanny123

11
শেষ অবধি, এও মনে রাখবেন যে __init__.pyফাইলটি আমদানির চেষ্টা করছেন এমন ফোল্ডারে যদি কিছু না থাকে তবে আপনি কোনও কিছু আমদানি করতে পারবেন না ।
Seanny123

3
@mzjn এটি import moduleNameযেখানে মডিউলনাম স্ট্রিং। কীভাবে from moduleName import *?
নাম জি ভিউ

2
আমার প্রশ্নের জন্য এখানে কেবল উত্তর খুঁজে পেয়েছে যদি কারওর
নাম জি ভিউ

68

importlib.import_moduleআপনি যা খুঁজছেন তা এটি আমদানি করা মডিউলটি প্রদান করে। (কেবল পাইথন> = 2.7 বা 3.x এর জন্য উপলব্ধ):

import importlib

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

এরপরে আপনি mymodule.myclassইত্যাদি হিসাবে মডিউলটিতে যে কোনও কিছু অ্যাক্সেস করতে পারবেন etc.


এই বিকল্পের পরামর্শ হিসাবে মডিউলটি বিকল্প হিসাবে imp.load_source(..)ব্যবহার করাimp হচ্ছে একটি বিকল্প স্ট্যাকওভারফ্লো.com
এভেজেনি সার্জিভ

5
@gecco এটি import moduleNameযেখানে মডিউলনাম স্ট্রিং। কীভাবে from moduleName import *?
নাম জি ভিউ

6

একটি তালিকা থেকে মডিউলগুলি আমদানির চেষ্টা করে কিছু সময় ব্যয় করেছে, এবং এটি সেই থ্রেড যা আমাকে বেশিরভাগ ক্ষেত্রে পেয়েছিল - তবে আমি ___ গুরুত্বপূর্ণ বিষয়বস্তু বুঝতে পারি না -

সুতরাং এখানে একটি স্ট্রিং থেকে একটি মডিউল কীভাবে আমদানি করবেন এবং ঠিক আমদানি করার মতো আচরণ পাবেন। এবং চেষ্টা করুন / ত্রুটি কেস ছাড়াও। :)

  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)

এবং হ্যাঁ, অজগর ২.7 এর জন্য আপনার কাছে অন্যান্য বিকল্প রয়েছে - তবে ২.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()

এখানে কেবলমাত্র বৈশিষ্ট্যটি হ'ল আপনার উদাহরণের প্যারাম তালিকা (প্যারাম 1, প্যারাম 2, প্যারাম 3) কাস্টমাইজ করা।


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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.