سؤال

أحاول تحميل الوحدات التي قمت بإنشائها ديناميكيا.

الآن هذا يعمل بشكل صحيح:

import structures.index

ولكن إذا جربت نفس الشيء عن طريق استيرادها ديناميكيا، فافشل.

struct = __import__("structures.index")

الخطأ المرفق هو:

Error ('No module named structures.index',)

أي أفكار لماذا؟


تحرير: عند استخدام النطاق الكامل (نوع الأعمال؟):

struct = __import__("neoform.structures.index")

هذا لا يرمي أي أخطاء، ومع ذلك، لا يقوم بتحميل وحدة الفهرس، فهو تحميل الوحدة النمطية "Neoform" بدلا من ذلك.

نتيجة "بنية" هي:

<module 'neoform' from '/neoform/__init__.py'>

أيضا، كمسألة جانبية، كيف يمكنني إنشاء فئة ثم إذن ضمن وحدة محملة ديناميكيا؟ (على افتراض أن جميع الوحدات تحتوي على اسم فئة مشتركة).

تحرير: الحل: (شكرا Coonj & Rick) هذا انتهى الأمر هو ما عمل. لست متأكدا لماذا (حتى الآن)، ولكن fromlist يجب أن يكون شيئا "أي شيء على ما يبدو، لأنه يعمل عندما أضع الحرف" A "كقيمة (غريبة، بالنظر إلى أن الملف يحتوي فقط على فئة واحدة في ذلك).

def get_struct_module(self, name):
    try:
        return = __import__("neoform.structures." + name, fromlist='*')
    except ImportError, e:
        self.out.add("Could not load struct: neoform.structure." + name + "\n\n" + "Error " + str(e.args))
هل كانت مفيدة؟

المحلول

لست متأكدا مما تعني ما "الأمر"، لذلك سأذكر ذلك __import__('structures.index') يجب، في الواقع، العمل، لكنه لا يعين اسم الوحدة النمطية في النطاق الحالي. للقيام بذلك (ثم استخدم فئة في الوحدة النمطية المستوردة بشكل حيوي)، عليك استخدام:

structures = __import__('structures.index')
structures.index.SomeClass(...)

التفاصيل الكاملة على __import__ تتوفر هنا.

تحرير: (بناء على تحرير السؤال)

نعم neoform.structures.index, ، وعودة index الوحدة، سوف تفعل ما يلي:

structures = __import__('neoform.structures.index', 
                        fromlist=['does not in fact matter what goes here!'])

لذلك إذا كان لديك قائمة بأسماء الحزمة packages, ، يمكنك استيراد بهم index وحدات وفناء بعض MyClass فئة لكل منها باستخدام التعليمات البرمجية التالية:

modules = [ __import__('neoform.%s.index' % pkg, fromlist=['a']) 
            for pkg in packages ]
objects = [ m.MyClass() for m in modules ]

نصائح أخرى

لاستيراد الوحدات الفرعية، تحتاج إلى تحديدها في fromlist alg من __import__()
مثال، أي ما يعادل:

import structures.index

يكون:

structures = __import__('structures', fromlist=['index'])

للقيام بذلك في خريطة أكثر صعوبة قليلا ...

import mod1.index
import mod2.index
import mod3.index

بالنسبة لتلك الواردات، كنت ترغب في تحديد وظيفة جديدة للحصول على index الوحدة الفرعية من كل وحدة:

def getIndexMods(mod_names):
  mod_list = map(lambda x: __import__(x, fromlist='index'))
  index_mods = [mod.index for mod in mod_list]
  return index_mods

الآن، يمكنك القيام بذلك للحصول على مراجع إلى جميع وحدات الفهرس:

index_mods = getIndexMods(['mod1', 'mod2', 'mod3'])

أيضا، إذا كنت ترغب في الاستيلاء على الوحدات الفرعية التي لا تسمى "فهرس"، فيمكنك القيام بذلك:

mod1, mod2, mod3 = map(lambda x,y: __import__(x, fromlist=y), 
  ['mod1', 'mod2', 'mod3'], ['index1', 'index2', 'index3'])

استخدم النطاق الكامل ("Neoform.Dureures.Index") مع طريقة المساعد هذه.

def import_module(name):
    mod = __import__(name)
    components = name.split('.')
    for comp in components[1:]:
        mod = getattr(mod, comp)
    return mod

module = import_module("neoform.structures.index")
# do stuff with module

مبرمج Java هنا، لكنني أعتقد أنك بحاجة إلى الوحدة النمطية للحماية

>>> import imp
>>> fm = imp.find_module('index', ['./structures']) # for submodule
>>> mymod = imp.load_module('structures.index', *fm)
>>> mymod
<module 'structures.index' from './structures/index.pyc'>
>>> x = mymod.insideIndex()
Initialising index class...

هاهو!

لماذا على الأرض سوف تحل محل

import structures.index

مع

map(__import__, ["structures.index"])

أول واحد (أ) يعمل، (ب) يكون ديناميكية و (ج) مدعومة مباشرة. ما هي حالة الاستخدام الممكنة هناك لاستبدال مصدر النص سهل التغيير بسهولة مع شيء أكثر تعقيدا؟

باختصار: لا تفعل هذا. ليس لديها أي قيمة.


يحرر

"أحصل على الاستيراد من قاعدة بيانات" هو جهد نبيل، لكنه لا يزال غير معقول. ما كتلة الكود يعتمد على تلك الواردات؟ هذا الكود كتلة كاملة - الواردات وجميع - هو ما تريد تنفيذه. يجب أن يكون هذا الكود كتلة - الواردات والبيانات وكل شيء - ملف وحدة نمطية بيثون قديم عادي.

استيراد هذه الكتلة من التعليمات البرمجية من نظام الملفات. استخدم قاعدة البيانات لتحديد الملف، مؤلف الملف - أي شيء تريد استخدام قاعدة البيانات ل. ولكن ببساطة استيراد وتنفيذ الوحدة النمطية أبسط الطريقة الممكنة.

في وقت متأخر حقا آخر هنا. لكنني كنت أبحث عن هذا السؤال على جوجل. فعلت بعض المحاكمة والخطأ. لست متأكدا مما إذا كان هذا القصاص سيساعد ولكن هنا. استخدامه لموقع القارورة.

modules = ['frontend', 'admin']
for module in modules:
    mod = __init__('controllers.%s' % module, fromlist=[module])
    app.register_blueprint(mod.blueprint_mod)


# or
from importlib import import_module
modules = ['frontend', 'admin']
for module in modules:
    mod = import_module('controllers.%s' % module)
    app.regitster_blueprint(mod.blueprint_mod)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top