从NTFS共享在Linux上导入Python模块

时间:2011-07-22 06:59:08

标签: python windows linux

我的问题是Python在Windows / Linux上搜索模块的方式不同。

我在Windows 7计算机(NTFS)上有一个目录foo,我在同一台计算机上运行的Ubuntu 10.04虚拟客户机中安装(通过VirtualBox的guest虚拟机添加)。在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)

这是guest虚拟机(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在使用foo/OS.py时加载相同的文件open('os.py'),这很好,因为NTFS不区分大小写。我不明白的是import的不同行为。我原本预计在两个平台上导入foo/OS.py,或者至少行为是相同的。

这种不一致是否有原因?

注意:''是两个平台上sys.path的第一个条目。

2 个答案:

答案 0 :(得分:2)

您的问题与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/(但我不知道它是否完全是最新的)。

答案 1 :(得分:0)

如果您想在linux环境中找到导入自制的OS.py,可以在PYTHONPATH变量中添加foo / dir的路径。 像这样:export PYTHONPATH = $ PYTHONPATH:/ PathToFoo。你也可以像这样运行python解释器:env PYTHONPATH = $ PYTHONPATH:/ PathToFoo python