2011-02-02 45 views
29

私はPythonにはまったく新しく、この質問は何度も尋ねられましたが、残念ながら私の状況は少し違っているようです... 私は作成しましたパッケージ(または私は思う)。カタログツリーは次のようになります。Pythonエラー:AttributeError: 'module'オブジェクトには属性がありません

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

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

def mod12(): 
    print "mod12" 

、私はその後lib.mod11()またはlib.mod12()、OK働く、import libそして、pythonを実行します。 最後の2つのどちらでも私に件名のエラーメッセージが表示されます。実際にdir(lib)の場合は、手順2の後にmod11またはmod12のいずれも表示されません。 本当にシンプルなものが欠けているようです。 (私はUbuntuのではPython 2.6を使用しています10.10)

はあなたに

+1

件名のエラーメッセージが不完全です。本文に完全なエラーメッセージを投稿すると便利です。 – Keith

答えて

5

私はそれが空__ init__.pyファイルを残すことがあるだろう道を感謝し、実行します。

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

from lib.mod1.mod11 import mod12 
mod12() 

mod1ディレクトリが不要で、libのmod12.pyがあることがあります。

29

import libとすると、パッケージをインポートしています。この場合に評価され実行される唯一のファイルは、libディレクトリにある0バイトの__init__.pyです。

この機能にアクセスするには、from lib.mod1 import mod1のような操作を行い、次にmod1.mod12()のようなmod12関数を実行します。

あなたがlibをインポートするときmod1にアクセスできるようにしたい場合は、libディレクトリ内__init__.pyファイル内import mod1を配置する必要があります。

22

より正確には、mod1libディレクトリはモジュールではなく、パッケージです。ファイルmod11.pyはモジュールです。

Pythonはサブパッケージまたはモジュールを自動的にインポートしません。あなたは明示的にそれを行うか、イニシャライザにインポートステートメントを追加することによって "不正行為"をしなければなりません。

>>> 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()と参照してください。

4

私のソリューションは、LIBの__init__.pyでこれらの輸入を入れている。そして、

in file: __init__.py 
import mod1 

は、

import lib 
lib.mod1 

正常に動作します。

関連する問題