注: 解決しました。同じモジュールの以前のバージョンをインポートしていたことが判明しました。
誰かが 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 の外で定義されています。