4

私のプログラム(python 2.7)に利用可能なモジュールのチェックを追加するために、古典的なインポートの代わりに次のコードを追加しました(アイデアは、誰かが余分なモジュールを見つけて追加するのを助けることです):

mymodules = ['socket', 'requests', 'simplejson', 'pickle', 'IPy',
    'pygeoip', 'urllib', 'time', 'urllib2', 'StringIO', 'gzip', 'os']

import sys, importlib   # these ones should be available, otherwise bad luck :)
for module in mymodules:
    try:
        importlib.import_module(module)
        print "importing ", module
    except:
        if module == "requests": info = "http://docs.python-requests.org/en/latest/user/install/#install or aptitude install python-requests"
        elif module == "requests": info = "https://github.com/simplejson/simplejson or aptitude install python-simplejson"
        elif module == "IPy": info = "https://github.com/haypo/python-ipy/wiki or aptitude install python-ipy"
        elif module == "pygeoip": info = "https://github.com/appliedsec/pygeoip or pip install pygeoip"
        else: info = "Oops, you should not see this - the description of the missing plugin is missing in the code"
        print "module {} is missing, see {}".format(module,info)
        sys.exit(0)

後で私のプログラムは( 'time' is not definedNameError ) の呼び出しでクラッシュします。したがって、モジュールのインポートを最初からテストしようとしました。time.time()

>>> import sys, importlib
>>> importlib.import_module("time")
<module 'time' (built-in)>
>>> print sys.modules.keys()
['copy_reg', 'sre_compile', '_sre', 'encodings', 'site', '__builtin__', 'sysconfig', '__main__', 'encodings.encodings', 'abc', 'importlib.sys', 'posixpath', '_weakrefset', 'errno', 'encodings.codecs', 'sre_constants', 're', '_abcoll', 'types', '_codecs', 'encodings.__builtin__', '_warnings', 'genericpath', 'stat', 'zipimport', '_sysconfigdata', 'warnings', 'UserDict', 'encodings.utf_8', 'sys', 'codecs', 'readline', '_sysconfigdata_nd', 'os.path', 'importlib', 'sitecustomize', 'signal', 'traceback', 'linecache', 'posix', 'encodings.aliases', 'time', 'exceptions', 'sre_parse', 'os', '_weakref']

timeある。それにもかかわらず:

>>> print time.time()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'time' is not defined

今、古典的な輸入で:

>>> import time
>>> print time.time()
1380831191.08

呼び出せるような方法でimportlib.import_module("time")インポートしないのはなぜですか?timetime.time()

4

3 に答える 3

10

ドキュメントから:

指定されたモジュールが挿入されsys.modules、返されます。

つまり、import_module変数は作成されません。自分で作成する必要があります。

time = importlib.import_module('time')

または、「動的」な場合:

globals()['time'] = importlib.import_module('time')

余談ですが、なぜこれを行うのですか?-ブロックで法線importをラップしないのはなぜですか?tryexcept

于 2013-10-04T10:55:14.123 に答える
2

importlib.import_module("time")オブジェクトを返すと思い ます。それを変数に割り当てる必要があります。その変数を使用して、時間のすべてのメソッドを呼び出します。

試す:

import sys, importlib

var_name = importlib.import_module("time")
print var_name.time()
于 2013-10-04T10:55:05.840 に答える
-1

これはコード行の無駄であり、別の場所にバグが存在する可能性があり、インポート システムも変更される可能性があります。あなただけならそのほうがいい

import requests

失敗するだけで、リクエストが欠落していることがわかるので、自分で調べたりインストールしたりできます。

于 2013-10-04T11:11:33.430 に答える