web-dev-qa-db-ja.com

Python error:AttributeError: 'module'オブジェクトには属性がありません

私はPythonにまったく不慣れです。この質問は何度も聞かれましたが、残念ながら私の状況は少し違うようです...パッケージを作成しました(または)。カタログツリーは次のようになります。

mydir
  lib     (__init__.py)
    mod1  (__init__.py, mod11.py)

カッコ内には、カタログ内のファイルがあります。 __init__.pyファイルは両方とも長さがゼロです。ファイルmydir/lib/mod1/mod11.pyには以下が含まれます。

def mod12():
    print "mod12"

今、私はpythonを実行し、import libを実行します。これは正常に動作し、次にlib.mod11()またはlib.mod12()を実行します。最後の2つのいずれかで、件名のエラーメッセージが表示されます。実際、ステップ2の後のdir(lib)mod11またはmod12のいずれも表示しません。本当にシンプルなものが欠けているようです。 (私はPython 2.6を使用しています)

ありがとうございました

35
Alex

_import lib_をすると、パッケージをインポートしています。この場合、評価して実行する唯一のファイルは、libディレクトリの0バイト___init__.py_です。

関数にアクセスしたい場合は、この_from lib.mod1 import mod1_のようなことをしてから、mod1.mod12()のような_mod12_関数を実行できます。

libをインポートするときに_mod1_にアクセスできるようにするには、libディレクトリ内の_import mod1_ファイル内に___init__.py_を配置する必要があります。

32
Noufal Ibrahim

より正確には、_mod1_およびlibディレクトリはモジュールではなく、パッケージです。ファイル_mod11.py_はモジュールです。

Pythonは、サブパッケージまたはモジュールを自動的にインポートしません。明示的に行うか、イニシャライザーにimportステートメントを追加して「チート」する必要があります。

_>>> import lib
>>> dir(lib)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
>>> import lib.pkg1
>>> import lib.pkg1.mod11
>>> lib.pkg1.mod11.mod12()
mod12
_

別の方法は、from構文を使用して、パッケージからスクリプト名前空間にモジュールを「プル」することです。

_>>> from lib.pkg1 import mod11
_

次に、関数を単にmod11.mod12()として参照します。

23
Keith

私がやる方法は、__ init__.pyファイルを空のままにして、次のようにすることです:

import lib.mod1.mod11
lib.mod1.mod11.mod12()

または

from lib.mod1.mod11 import mod12
mod12()

Mod1 dirは不要であり、libにmod12.pyがあるだけであることがわかります。

5

私の解決策は、これらのインポートを__init__.pyのlib:

in file: __init__.py
import mod1

その後、

import lib
lib.mod1

うまくいくでしょう。

4
Henry