質問

実行時に、Pythonコードはロードするサブモジュールの名前を取得します。これは前にわかりません。さて、このサブモジュールが既存のモジュールの内側に存在する場合はチェックしたいです。 foobarを指定できるこの構造を検討してください。

master/
|
|- __init__.py
|
|- foo/
|  |
|  |- __init__.py
|
|- bar/
   |
   |- __init__.py
.

今、私はこれを行います。これはDEFと変数のために機能します:

import master

unknown_submodule = "foo"
if hasattr(master, unknown_submodule):
    pass # all's well
.

または私はAtomateErrorをキャッチしています。

しかし、上記のファイル構造では、このアプローチを上げて作業することはできません。 hasattr()は常にfalseを返します(つまり、常にAttributionErrorスローされている)。

dir(master)を見れば、この出力が表示されます。

['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
.

および__all__master/__init__.pyを明示的に指定することでさえも役に立ちませんが、dir()を

に変更します。
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
.

私が間違っていること、またはこれらの種類のテストを達成する方法がある場合(BTW:Win / CygwinのPython 2.6、あらゆる興味の場合)

役に立ちましたか?

解決

サブモジュールは、明示的に記載されていない限り、それらの親モジュールの属性ではありません。モジュールをインポートしてImportErrorをキャッチしようとするだけで:

try:
    __import__("os.peth", fromlist=[os])
except ImportError:
    pass
.

他のヒント

you can do

try:
 import module.submodule

except ImportError:
  print 'failed or whatever'

I recently had to check submodule existence and since I'm using python 3.4.1, I'm giving a new answer to the question:

In python 3.4.1 you can use importlib.util.find_spec(name, package=None) (https://docs.python.org/3.4/library/importlib.html#importlib.util.find_spec)

import importlib
module_exists = importlib.util.find_spec('path.to.my.module')

That easy =)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top