75

これは問題にアプローチするための厄介な方法だと思いますが...

いくつかの条件に基づいて、Python でいくつかのインポートを行いたいとしましょう。

このため、関数を書きたいと思います。

def conditional_import_modules(test):
    if test == 'foo':
        import onemodule, anothermodule
    elif test == 'bar':
        import thirdmodule, and_another_module
    else:
        import all_the_other_modules

インポートしたモジュールをグローバルに利用できるようにするにはどうすればよいですか?

例えば:

conditional_import_modules(test='bar')
thirdmodule.myfunction()
4

9 に答える 9

82

インポートされたモジュールは単なる変数です - 名前はいくつかの値にバインドされています。必要なのは、それらをインポートして、globalキーワードでグローバルにすることだけです。

例:

>>> math
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'math' is not defined
>>> def f():
...     global math
...     import math
...
>>> f()
>>> math
<module 'math' from '/usr/local/lib/python2.6/lib-dynload/math.so'>
于 2012-08-16T15:39:09.043 に答える
17

次のように、関数内でインポートをグローバルにすることができます。

def my_imports(module_name):
    globals()[module_name] = __import__(module_name)
于 2012-08-16T16:25:56.370 に答える
5

組み込み関数__import__を使用して、グローバル スコープのモジュールを条件付きでインポートできます。

最上位モジュールをインポートするには (考えてください: import foo):

def cond_import():
  global foo
  foo = __import__('foo', globals(), locals()) 

階層からのインポート (考えてください: import foo.bar):

def cond_import():
  global foo
  foo = __import__('foo.bar', globals(), locals()) 

階層とエイリアスからインポートします (考えてください: import foo.bar as bar):

def cond_import():
  global bar
  foo = __import__('foo.bar', globals(), locals()) 
  bar = foo.bar
于 2016-10-09T07:46:18.780 に答える
4

私はちょうど同様の問題を抱えていました、ここに私の解決策があります:

class GlobalImport:

    def __enter__(self):
        return self

    def __call__(self):
        import inspect
        self.collector = inspect.getargvalues(inspect.getouterframes(inspect.currentframe())[1].frame).locals

    def __exit__(self, *args):
        globals().update(self.collector)

次に、コード内の任意の場所:

with GlobalImport() as gi:
    import os, signal, atexit, threading, _thread
    # whatever you want it won't remain local
    # if only 
    gi()
    # is called before the end of this block

# there you go: use os, signal, ... from whatever place of the module
于 2018-10-17T14:11:37.317 に答える
1

この関数でインポートしたいモジュールの名前を返してから、

mod == __import__(module_name)
于 2012-08-16T15:28:30.540 に答える