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

从NTFS共享导入Linux上的Python模块,python,windows,linux,Python,Windows,Linux,我的问题是Python在Windows/Linux上搜索模块的方式不同 我在Windows7机器(NTFS)上有一个目录foo,我将它装载在同一台机器上运行的Ubuntu10.04虚拟来宾中(通过VirtualBox的来宾添加)。在foo内部,有一个文件OS.py(请注意大写)包含以下内容: bar = 1 以下是foo中主机(win7)上Python(2.5.4)会话的输出: >>> f = open('os.py') # Note the lower case >&

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

我在Windows7机器(NTFS)上有一个目录
foo
,我将它装载在同一台机器上运行的Ubuntu10.04虚拟来宾中(通过VirtualBox的来宾添加)。在
foo
内部,有一个文件
OS.py
(请注意大写)包含以下内容:

bar = 1
以下是
foo
中主机(win7)上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)
>>> 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']
下面是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)
(content of the Python standard os package)
>>> 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不区分大小写。我不明白的是关于
导入的不同行为。我本以为
foo/OS.py
会在两个平台上导入,或者至少行为是相同的

这种不一致有什么原因吗


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

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

您的问题与Linux或NTFS无关,在纯Windows环境中,任何Windows文件系统NTFS或FAT的行为都完全相同:Windows将文件名视为不区分大小写,但是Python认为模块名区分大小写

这里所发生的一切是,当Python搜索一个模块时,它会进行自己的区分大小写的搜索,这样它就永远不会看到小写文件名:它不是盲目地试图打开Python路径上每个文件夹中的文件“OS.py”,而是在每个文件夹中搜索名为“OS”的文件以及一些可能的扩展名,Windows上的搜索可能会返回名为“os”的文件,但它们会立即被过滤掉并被忽略

如果我没记错的话,确切的行为会随着时间的推移而变化:非常旧的Python版本在Windows上导入模块时会忽略这种情况,然后它变成了一个警告,现在它只是忽略了它们


有关更多信息,请参阅(但我不知道它是否完全是最新的)。

听起来更像是一个VirtualBox问题,而不是Python问题…@ignacio:你为什么这么认为?理论上,客户机上的Python甚至不应该注意到它正在虚拟操作系统中运行,至少不是用于搜索和读取文件等操作。问题不在于它在虚拟机中运行,而在于文件共享。出于某种原因,VFS认为“OS.py”与“OS.py”是同一个文件。@ignacio:但这不正确吗?NTFS应该不区分大小写,因此
OS.py
OS.py
之间应该没有区别。在上面的代码中,对
open
的调用就是这样的。即使NTFS区分大小写,仍然存在一个问题,即为什么
open
import
的行为不同。我知道我可以更改
PYTHONPATH
环境变量,但这只解决了一种特殊情况,即我知道名称有问题的模块的位置。我更感兴趣的是找出为什么会发生这种情况,以及在一般情况下如何避免这种情况。这就是我所怀疑的。你知道我在哪里可以找到更多的信息吗?关于这个话题的文章不是很详细。我添加了一个到政治公众人物的链接,但它已经很老了。“建议的新语义”似乎已在Python 2.1 beta 1中实现: