我的问题是Python在Windows/Linux上搜索模块的方式有所不同。
我在Windows 7计算机(NTFS)上有一个目录foo
,我将其安装在同一计算机上运行的Ubuntu 10.04虚拟客户机中(通过VirtualBox的客户机添加)。在foo
内部,有一个文件OS.py
(请注意大写),其内容如下:
bar = 1
这是
foo
内主机(Win 7)上Python(2.5.4) session 的输出:>>> 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的 guest (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 - 从NTFS共享导入Linux上的Python模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6786644/