我的问题是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
的第一个条目。
答案 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