2011-01-13 10 views
6

注:解決しました。私は同じモジュールの以前のバージョンをインポートしていたことが判明しました。python NameError:名前 '<anything>'は定義されていません(でも!)

誰かがNameErrorを実行したStackOverflowで、同様のトピックを簡単に見つけることができます。しかし、質問のほとんどは特定のモジュールを扱いますが、解決策はしばしばモジュールを更新することです。

私の場合、自分で書いたモジュールから関数をインポートしようとしています。モジュールの名前はInfraPyで、sys.path上にあることは間違いありません。 InfraPyの特定の関数(listToText)はNameErrorを返しますが、別のスクリプトにインポートしようとするときに限ります。 InfraPyの中では、if __name__=='__main__':の下では、listToText関数は正常に機能します。 InfraPyから、問題なく他の関数をインポートできます。私のスクリプトにfrom InfraPy import *を含めると、listToText関数を使用しようとするまでエラーは返されません。

どうしてですか?
特定の関数をインポートすると、同じモジュール内の他の関数をすべてインポートすると、NameErrorが返されます。 MacOSXの10.6上のpython 2.6を使用して

は、また、.NET 4.0

感謝のためにIronPythonの2.6を使用して、Windows 7の上でスクリプトを実行している同じエラーが発生しました。

これを解決するのに役立つと思われるその他の詳細がある場合は、それらを提供してもらいたいと思います。

要求されたとして、ここでは関数定義はInfraPyの内側にある:

def listToText(inputList, folder=None, outputName='list.txt'): 
    ''' 
    Creates a text file from a list (with each list item on a separate line). May be placed in any given folder, but will otherwise be created in the working directory of the python interpreter. 
    ''' 
    fname = outputName 
    if folder != None: 
     fname = folder+'/'+fname 
    f = open(fname, 'w') 
    for file in inputList: 
     f.write(file+'\n') 
    f.close() 

この機能は、上記で定義されているとif __name__=='__main__':

の外に、私は、スクリプトに関連して周りInfraPyを移動しようとしました。最も困惑しているのは、InfraPyが同じフォルダ内にという同じフォルダ内にあるで、from InfraPy import listToTextを使用してインポートすると、このエラーが表示されます。NameError: name listToText is not definedここでも、他の関数は正しくインポートされ、InfraPyのif __name__=='__main__':の外で定義されています。モジュールは__all__定義さ

を持っている場合、これが発生する可能性が

+3

あなたが受け取っている正確なエラーメッセージを投稿してください。 – Amber

+1

あなたは__InfraPy__モジュールのソースコードを調達できますか?それはここで役立ちます。私が最初に推測しているのは、ブロック__list__Text__をbloc 'の中で定義しているということです。もし__name __ == '__ main __':'あなたですか? ' – mouad

+0

モジュールの関数やクラスの定義を投稿することをお勧めします'def'または 'class'の行ではなく、本体なしで)、モジュールの外部からアクセス可能な少なくとも1つと、そうでないモジュールを示します。 –

答えて

3

代わりに代わり1のインポートなっているあなたのパス内のモジュールの別のバージョンがあるかもしれませんあなたは

を期待している程度listToTextまたはNameErrorですそれは例外の原因となっている関数の中にあるのでしょうか?

+0

ありがとうgnibbler、それはsys.path上のモジュールの別のバージョンのようです。 InfraPyとテストスクリプトを使用して新しいフォルダを作成し、サイトパッケージディレクトリからいくつかの.pthファイルを削除すると、うまくいきました。その新しいフォルダからInfraPyを削除し、.pthファイルを復元すると、私はこの投稿を開始したのと同じエラーを受けました。見つけて解決しました。ありがとう! – BenjaminGolder

3

さらに、__all__変数gnibblerにはInfraPy.pycファイルのどこかに問題があると述べられています。

まず、import pdb;pdb.set_trace()をInfraPy.pyファイルに入れて、正しいファイルになっていることを確認し、InfraPy.pyの定義を実行して何が起こっているのかを確認することをおすすめします。ブレークポイントが得られない場合、考えているファイル以外のファイルをインポートしています。

また、インポート後にdir(InfraPy)を入力し、実際にインポートするファイルをInfraPy.__file__で確認することもできます。

インポートデバッグのヒントはもう考えられません。 ;-)

+0

Lennartに感謝します。この場合、特にInfraPy .__ file__のヒントが本当に便利です。私はInfraPy.pycのためにいくつかの釣りをして、問題を引き起こしていたかもしれないものを見つけました。 – BenjaminGolder

関連する問題