我的问题是 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)
这是客户机 (Ubuntu) 的输出,在 foo
中运行 Python 2.6.5:
>>> 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 在使用 open('os.py')
时加载相同的文件 foo/OS.py
,这很好,因为 NTFS 是不区分大小写。我不明白的是关于 import
的不同行为。我原以为 foo/OS.py
会在两个平台上导入,或者至少行为是相同的。
这种不一致有什么原因吗?
注意:''
是两个平台上 sys.path
中的第一个条目。
最佳答案
您的问题与 Linux 或 NTFS 无关,在具有任何 Windows 文件系统 NTFS 或 FAT 的纯 Windows 环境中,行为完全相同:Windows 认为文件名不区分大小写,但 Python 认为模块名称区分大小写。
这里发生的一切是,当 Python 搜索一个模块时,它会进行自己的区分大小写的搜索,因此它永远不会看到小写的文件名:它不会盲目地尝试在每个模块中打开文件“OS.py” Python 路径上的文件夹,它会在每个文件夹中搜索名为“OS”的文件以及许多可能的扩展名中的任何一个,在 Windows 上搜索可能会返回名为“os”的文件,但它们会立即被过滤掉并被忽略。
如果我没记错的话,确切的行为随着时间的推移而变化:在 Windows 上导入模块时,非常旧的 Python 版本会忽略大小写,然后它变成了警告,现在它只是忽略它们。
有关详细信息,请参阅 http://www.python.org/dev/peps/pep-0235/ (但我不知道它是否完全是最新的)。
关于python - 从 NTFS 共享导入 Linux 上的 Python 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6786644/