17

Python 3.5.2 でスクリプトを実行しているコンピューターに nmap ライブラリがインストールされているかどうかを確認するために、importlib ライブラリを使用しようとしています。

使用しようとしてimportlib.util.find_spec("nmap")いますが、次のエラーが表示されます。

>>> import importlib
>>> importlib.util.find_spec("nmap")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'importlib' has no attribute 'util'

誰かが私が間違っているところを教えてもらえますか?

編集

次のコードを使用して、関数を機能させることができました。

#!/usr/bin/pythonw

import importlib
from importlib import util

#check to see if nmap module is installed
find_nmap = util.find_spec("nmap")
if find_nmap is None:
    print("Error")
4

1 に答える 1

29

これを試して:

from importlib import util
util.find_spec("nmap")

調査するつもりですが、正直なところ、なぜ一方が機能し、もう一方が機能しないのかわかりません。また、次の対話型セッションも観察してください。

>>> import importlib
>>> importlib.util
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'importlib' has no attribute 'util'
>>> from importlib import util
>>> util
<module 'importlib.util' from '/usr/lib/python3.5/importlib/util.py'>
>>> importlib.util
<module 'importlib.util' from '/usr/lib/python3.5/importlib/util.py'>

そう...ええ。これは誰かにとっては完全に理にかなっていると確信していますが、私にはそうではありません。分かり次第更新します。

アップデート:

これを次のようなものと比較します。

>>> import datetime
>>> datetime
<module 'datetime' from '/usr/lib/python3.5/datetime.py'>
>>> datetime.datetime
<class 'datetime.datetime'>

datetime違いは、この場合、最初はモジュールであり、2 番目はクラスであるのに対し、このimportlib.util場合は両方ともモジュールであるということだと思います。したがってmodule.module、両方のモジュールからのコードがロードされていない限り、おそらく OK ではありませんがmodule.class、モジュールがインポートされるときにクラス コードがロードされるため、OK です。

アップデート #2

module.moduleいや、大丈夫な場合が多いようです。例えば:

>>> import urllib
>>> urllib
<module 'urllib' from '/usr/lib/python3.5/urllib/__init__.py'>
>>> urllib.error
<module 'urllib.error' from '/usr/lib/python3.5/urllib/error.py'>

したがって、おそらくそれは に固有のものimportlibです。

アップデート #3

@kfbがコメントで指摘したように、importlib具体的には関連しているようです。__init__.pyforimportlibからの次のコメントを参照してください。

# Until bootstrapping is complete, DO NOT import any modules that attempt
# to import importlib._bootstrap (directly or indirectly). Since this
# partially initialised package would be present in sys.modules, those
# modules would get an uninitialised copy of the source version, instead
# of a fully initialised version (either the frozen one or the one
# initialised below if the frozen one is not available).

importlib/util.py インポートimportlib._bootstrapするので、これは実現していると思います私の理解が正しければ、サブモジュールは初期化されますが、インポートimport importlibしたモジュール オブジェクトに対しては初期化されません。importlibこの時点で、そうすると、dir(importlib)は表示されませんutil。興味深いことに、アクセスしようとしてを取得した、(他のサブモジュールと共に) がロード/初期化され、!にアクセスできるようになりました。importlib.utilAttributeErrorutilimportlib.util

>>> import importlib
>>> dir(importlib)
['_RELOADING', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__import__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_bootstrap', '_bootstrap_external', '_imp', '_r_long', '_w_long', 'find_loader', 'import_module', 'invalidate_caches', 'reload', 'sys', 'types', 'warnings']
>>> importlib.util
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'importlib' has no attribute 'util'
>>> importlib.util
<module 'importlib.util' from '/usr/lib/python3.5/importlib/util.py'>
>>> dir(importlib)
['_RELOADING', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__import__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_bootstrap', '_bootstrap_external', '_imp', '_r_long', '_w_long', 'abc', 'find_loader', 'import_module', 'invalidate_caches', 'machinery', 'reload', 'sys', 'types', 'util', 'warnings']
于 2016-09-23T12:44:59.363 に答える