python - LinuxでのNTFS共有からのPythonモジュールのインポート

python windows linux

私の問題は、PythonがWindows / Linuxでモジュールを検索する方法の違いです。

Windows 7マシン(NTFS)にディレクトリfooがあり、同じマシンで実行されているUbuntu 10.04仮想ゲストに(VirtualBoxのゲスト追加を介して)マウントします。 foo内には、次の内容のファイルOS.py(大文字に注意)があります。

bar = 1


これは、foo内のホスト(Win 7)でのPython(2.5.4)セッションの出力です。

>>> 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はfoo/OS.pyを使用するときに同じファイルopen('os.py')をロードします。これは、NTFSでは大文字と小文字が区別されないため、問題ありません。私が理解していないのは、importに関する異なる動作です。 foo/OS.pyが両方のプラットフォームにインポートされるか、少なくとも動作が同じであることを期待していました。

この矛盾の理由はありますか?

注:''は、両方のプラットフォームでsys.pathの最初のエントリーです。
答え
問題はLinuxまたはNTFSとは関係ありません。動作は、WindowsファイルシステムがNTFSまたはFATの純粋なWindows環境でまったく同じです。Windowsはファイル名を大文字と小文字を区別せず、Pythonはモジュール名を大文字と小文字を区別します。

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

正確な動作が時間とともに変化したことを正しく覚えている場合、非常に古いバージョンのPythonはWindowsでモジュールをインポートするときに大文字と小文字を区別しませんでしたが、警告になり、現在は単に無視されます。

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

python - python / IDLEを使用してファイルを開くと、パス名に「そのようなファイルまたはディレクトリはありません」が返される

python - 適切な数のプロセスを定義する

python - Python Pmwとcx_Freeze?

python - ねじれた認証パン問題

python - Linuxのdjango filebrowser 3.2のデコードエラー

python - MathMLへのPython式

python - ObjCでRaw Binary / Hexデータを宣言する方法とそれを引数で渡す方法は?

python - 簡単な画像をラベルに追加しようとしています

python - なぜこれがnumpy配列からpygame表面リークメモリにブリットするのですか?

python - Linux用のロック画面を作成していますか?