6

注: 解決しました。同じモジュールの以前のバージョンをインポートしていたことが判明しました。

誰かが NameError に遭遇した StackOverflow で同様のトピックを見つけるのは簡単です。しかし、ほとんどの質問は特定のモジュールを扱っており、多くの場合、解決策はモジュールを更新することです。

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

これはどのように発生しますか?
特定の関数をインポートすると 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. 繰り返しますが、他の関数は正常にインポートされます。それらはすべてif __name__=='__main__':InfraPy の外で定義されています。

4

2 に答える 2

4

これは、モジュールが__all__定義されている場合に発生する可能性があります

または、期待しているバージョンではなく、インポートされている別のバージョンのモジュールがパスにある可能性があります

NameErrorについてですか、listToTextそれとも例外の原因となっている関数内の何かですか?

于 2011-01-13T23:40:47.903 に答える
3

さらに、__all__言及した変数 gnibbler は、どこかにある InfraPy.pyc ファイルにも問題がある可能性があります。

InfraPy.py ファイルに最初のを入れてimport pdb;pdb.set_trace()正しいファイルにいることを確認し、InfraPy.py の定義をステップ実行して何が起こっているかを確認することをお勧めします。ブレークポイントが得られない場合は、思ったよりも別のファイルをインポートしています。

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

現在、これ以上のインポートのデバッグのヒントは考えられません。;-)

于 2011-01-14T00:15:06.243 に答える