4

作成したモジュールを動的にロードしようとしています。

現在、これは正しく機能します。

import structures.index

しかし、動的にインポートして同じことを試してみると、失敗します。

struct = __import__("structures.index")

提供されるエラーは次のとおりです。

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

なぜ何かアイデアはありますか?


編集:フルスコープを使用する場合(それは一種の作品ですか?):

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

これはエラーをスローしませんが、インデックスモジュールをロードするのではなく、代わりに「neoform」モジュールをロードします。

「struct」の結果は次のとおりです。

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

また、副次的な質問として、動的にロードされたモジュール内でクラスをインスタンス化するにはどうすればよいですか?(すべてのモジュールに共通のクラス名が含まれていると仮定します)。

編集:解決策:( coonj&Rickに感謝)これは結局うまくいったものでした。理由は(まだ)わかりませんが、fromlist「a」という文字を値として指定すると機能するため、「どうやら何か」である必要がありました(ファイルにクラスが1つしかないため、奇妙なことになります)。

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))
4

7 に答える 7

11

「失敗する」とはどういう意味かわからないので__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インポートし、次のコードを使用してそれぞれのクラスをインスタンス化できます。indexMyClass

modules = [ __import__('neoform.%s.index' % pkg, fromlist=['a']) 
            for pkg in packages ]
objects = [ m.MyClass() for m in modules ]
于 2009-04-20T18:50:01.530 に答える
4

サブモジュールをインポートするには、Foの例のfromlist引数でサブモジュールを指定する必要があります__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'])

また、「index」という名前ではないサブモジュールを取得する場合は、次のようにすることができます。

mod1, mod2, mod3 = map(lambda x,y: __import__(x, fromlist=y), 
  ['mod1', 'mod2', 'mod3'], ['index1', 'index2', 'index3'])
于 2009-04-20T18:52:45.377 に答える
3

このヘルパーメソッドでは、フルスコープ( "neoform.structures.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
于 2009-04-20T21:23:16.793 に答える
1

ここではJavaプログラマーですが、 impモジュールが必要だと思います

于 2009-04-20T18:41:13.563 に答える
1
>>> 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...

出来上がり!

于 2010-03-22T13:21:44.750 に答える
0

一体なぜあなたは取り替えますか

import structures.index

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

最初のものは(a)動作し、(b)動的で、(c)直接サポートされます。変更しやすいプレーンテキストのソースをより複雑なものに置き換えるために、どのようなユースケースが考えられますか?

要するに:これをしないでください。価値はありません。


編集

「データベースからインポートを取得しています」は高潔な努力ですが、それでも賢明ではありません。どのコードブロックがそれらのインポートに依存しますか?そのコードブロック全体(インポートとすべて)が実行したいものです。そのコードブロック全体(インポート、ステートメント、その他すべて)は、単純な古いpythonモジュールファイルである必要があります。

そのコードブロックをファイルシステムからインポートします。データベースを使用して、ファイルの作成者であるファイルを特定します。データベースを使用する目的は何でもかまいません。ただし、モジュールをインポートして実行するのは、可能な限り簡単な方法です。

于 2009-04-20T19:23:19.127 に答える
0

ここに本当に遅い投稿。しかし、私はグーグルでこの質問を探していました。私はいくつかの試行錯誤をしました。このスニペットが役立つかどうかはわかりませんが、ここにあります。Flaskサイトに使用します。

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)
于 2013-03-15T02:00:00.733 に答える