2012-05-02 14 views
2

私はこの質問が以前に聞かれたのを見るが、私はまだPythonモジュールを扱うことに頭を抱えようとしている。一般的なPythonモジュール

app/ 
    __init__.py 
    driver.py 
    dbloader/ 
    __init__.py 
    loader.py 

両方__init__.pyファイルが空である: 私のアプリは非常に基本的な構造を有しています。 driver.pyは唯一のアプリケーション/ディレクトリ内にこのセットアップ、cdをテストするための1つのクラスドライバ()とその中のloader.pyている唯一のクラスローダ()だから、

を持っています。ここから私はPythonシェルを起動します。次に試してみます:

import dbloaderこれは動作します(エラーはありません)。しかし、私はloader.pyの内部でLoader()をインスタンス化するためにあらゆる順列を試しました。私が試したもののいくつかのものがある:

from dbloader import loader 
from dbloader.loader import Loader 

私も

がちょうどdbloaderインポートして、次のようにインスタンス化しようと試みた:

import dbloader 
l = dbloader.Loader() 

すべて無駄に。私は、現在のディレクトリとサブディレクトリがPythonシェルを実行するときにpythonpathに自動的に含まれていると読んでいます(これは本当ですか?)

いずれにせよ、

+0

dbloaderをインポートするとき l = dbloader.Loader()、どのようなエラーが発生しますか? –

+0

なぜ2つのソリューションの問題が発生しているのかわかりません:from dbloader import loader'と 'from dbloader.loader import Loader'です。最初は 'Loader'を' loader.Loader'として提供し、2番目は 'Loader'を提供します。スタックトレースを投稿できますか? – Darthfett

+0

NiekとDarthは、「名前ローダーをインポートできませんでした」というエラーが発生していましたが、ダニエルの提案に従って修正されています。これは、すでに行っていたことと似ています。脂肪指の – rdodev

答えて

3

dbloaderそれ自体は、Loaderクラスへの参照がありません。しかし、それを行うには、loader名前空間を通過する必要があります。だから、2つの可能な方法:それは名前空間ではなく、モジュールやクラスについて考え

from dbloader import loader 
l = loader.Loader() 

または

from dbloader.loader import Loader 
l = Loader() 

に役立ちます。 Loaderdbloader.loader名前空間にあり、そのクラスにアクセスできるようにするには、クラス自体またはそれを含むモジュールを現在の名前空間にインポートする必要があります。

+0

ありがとうございました。これは私のことを明確にするのに役立ちました。 – rdodev

2

import XあなたのネームスペースにXを追加します。

import dbloader - これにより、moduledbloaderが追加されます。あなたのクラスにはdbloader.loader.Loader

from dbloader import loader - これでモジュールloaderが名前空間に追加されます。あなたはloader.Loaderであなたのクラスにアクセスします。

from dbloader.loader import Loader - クラスLoaderを名前空間にインポートします。ここではLoader()を使用します。

dirhelpというPythonシェルで遊んでみてください。そうすれば構造が少し良くなるはずです。

+0

実際には、 'dbloader'の' __init __。py'が空であれば、これを実行します: 'import dbloader; 'dbloader.loader' は' import dbloader'が '__init __。py'ファイルを単に実行していて' dbloader'をそのスコープにリンクしているために失敗します。 'loader'は存在しません。実行する必要があります ' from dbloader import loader'ま​​たは 'import dbloader.loader'を使用して' loader'にアクセスします。 – majackson

+0

@majackson、そうです。 – Daenyth

0

Daenythとダニエル・ローズマンによって提案された解決策を使用するだけで、あなたは、dbloaderから直接dbloaderで、あなたの場合からインポートローダーをLoaderにアクセスすることができます。

:あなたのシェルで、

# app/dbloader/__init__.py 
from dbloader.loader import Loader 

その後

import dbloader 
l = dbloader.Loader() 

# or... 

from dbloader import Loader 
l2 = Loader() 

これは名前空間を整理するための素晴らしいソリューションです。

+1

これは通常、あなたのモジュール構造が間違っているというヒントです。 – Daenyth

+0

@Daenyth私は「普通」とは言いません。非常に大きな自己完結型のクラスを持っている場合、それをそれ自身のファイルに入れるのは理にかなっています。例えば、 'util'モジュール中の数学的ベクトルクラス' Vector'はどこからでも 'util.vector import vector'からあらゆるものをインポートすることを厄介にするでしょう。 – Darthfett

+0

これはおそらく有効なケースですが、私は、クラスが10行のときにファイルごとに1つのクラスのようなJavaからのホールドオーバーを取得するものをもっと参考にしています(そして、最初のクラスである必要はありませんでした...) – Daenyth