我的问题是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/

10-12 22:49
查看更多