2011-07-22 6 views
2

私の問題は、PythonがWindows/Linux上でモジュールを検索する方法の違いです。PythonモジュールをLinux上でNTFS共有からインポートする

Windowsマシン(NTFS)にディレクトリfooがあります。これは、同じマシン上で(VirtualBoxのゲスト追加を介して)実行されているUbuntu 10.04仮想ゲストにマウントされています。ここで

bar = 1 

foo内部ホスト(勝利7)上のPython(2.5.4)セッションの出力です:

foo内では、次の内容のファイル OS.py(大文字に注意してください)があります
>>> f = open('os.py') # Note the lower case 
>>> f.readlines() 
['bar = 1\n'] 
>>> f.close() 
>>> import os 
>>> dir(os) 
(content of the Python standard os package) 

そして、ここでは出力がfooでのPython 2.6.5を実行し、ゲスト(Ubuntuの)上にある:

>>> f = open('os.py') # Note the lower case 
>>> f.readlines() 
['bar = 1\n'] 
>>> f.close() 
>>> import os 
>>> dir(os) 
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'bar'] 

だから、両方のプラットフォームで、PythonのLO広告にはfoo/OS.pyと同じファイルopen('os.py')が使用されます。これは、NTFSでは大文字と小文字を区別しないためです。私が理解していないのは、importに関する異なる動作です。 foo/OS.pyが両方のプラットフォームでインポートされるか、少なくとも動作が同じであることが予想されます。

この矛盾の原因はありますか?

注:''は、両方のプラットフォームでsys.pathの最初のエントリです。

+0

Pythonの問題よりもVirtualBoxの問題に似ています... –

+0

@ignacio:あなたはどう思いますか?理論上、ゲストのPythonは、仮想OSで動作していることに気づくべきではありません。少なくとも、ファイルの検索や読み込みなどの操作ではありません。 –

+0

問題はVMで実行されているのではなく、ファイル共有であるということです。何らかの理由でVFSは "OS.py"は "os.py"と同じファイルだと考えています。 –

答えて

2

あなたの問題はLinuxやNTFSとは何の関係もなく、純粋なWindows環境でWindowsファイルシステムNTFSと全く同じ動作をしますまたはFAT:Windowsはファイル名を大文字と小文字を区別しないとみなしますが、Pythonはモジュール名を大文字と小文字を区別して扱います。

ここで起こっているのは、Pythonがモジュールを検索するときに、大文字と小文字を区別した検索を行うため、小文字のファイル名が表示されないようにすることです。盲目的に 'OS.py'ファイルを開きません。 Pythonパス上のすべてのフォルダでは、 'OS'という名前のファイルといくつかの拡張子を含む各フォルダを検索していますが、Windows上で検索すると 'os'という名前のファイルが返される可能性があります。

私が正しく覚えていれば、正確な動作は時間の経過とともに変化しています。Windows上でモジュールをインポートするとき、非常に古いバージョンのPythonがそのケースを無視して警告を受け、単に無視します。

詳細についてはhttp://www.python.org/dev/peps/pep-0235/を参照してください(ただし、完全に最新であるかどうかはわかりません)。

+0

それは私が疑ったものです。あなたは私が詳細な情報をどこで見つけることができるか知っていますか? [Python docs for modules](http://docs.python.org/tutorial/modules.html)は、このトピックに関してはあまり詳細ではありません。 –

+0

私はPEPへのリンクで追加しましたが、かなり古いです。 「提案された新しいセマンティクス」は、Python 2.1ベータ1で実装されているようです:http://www.python.org/download/releases/2.1.2/NEWS.txt – Duncan

0

Linux環境で自作のOS.pyをインポートする場合は、PYTHONPATH変数にfoo/dirへのパスを追加できます。 このようなもの:export PYTHONPATH = $ PYTHONPATH:/ PathToFoo。 env PYTHONPATH = $ PYTHONPATH:/ PathToFoo python

+0

私は 'PYTHONPATH'環境変数を変更できることを知っていますが、問題のある名前のモジュールの場所を知っている特定のケースだけを解決します。私は、なぜこれが起こり、一般的なケースでそれを避けるために何をすべきかを知ることにもっと興味があります。 –

関連する問題