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

2 投票
2 回答
779 浏览
提问于 2025-04-16 22:03

我的问题是Python在Windows和Linux上查找模块的方式不同。

我在一台Windows 7的电脑上有一个叫foo的文件夹(使用NTFS格式),然后我通过VirtualBox的增强功能把这个文件夹挂载到同一台电脑上运行的Ubuntu 10.04虚拟机里。在foo文件夹里,有一个叫OS.py的文件(注意字母是大写),里面的内容如下:

bar = 1

这是在主机(Windows 7)上,使用Python(2.5.4)在foo文件夹里的输出结果:

>>> 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)上,使用Python 2.6.5在foo文件夹里的输出结果:

>>> 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']

所以在这两个平台上,当使用open('os.py')时,Python都能加载同一个文件foo/OS.py,这没问题,因为NTFS对大小写不敏感。我不明白的是关于import的不同表现。我本以为在这两个平台上都能导入foo/OS.py,或者至少行为应该是一样的。

这种不一致有什么原因吗?

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

2 个回答

0

如果你想在Linux环境中找到并使用自己制作的OS.py文件,可以把它所在的foo/文件夹的路径添加到PYTHONPATH这个变量里。你可以这样做:export PYTHONPATH=$PYTHONPATH:/PathToFoo。还有,你也可以这样运行Python解释器:env PYTHONPATH=$PYTHONPATH:/PathToFoo python。

2

你的问题和Linux或NTFS没有关系,在纯Windows环境下,不管是NTFS还是FAT文件系统,表现都是一样的:Windows对文件名是不区分大小写的,但Python对模块名是区分大小写的。

这里发生的事情是,当Python在找一个模块时,它会进行区分大小写的搜索,所以它根本看不到小写的文件名:它并不是在Python路径上的每个文件夹里盲目地尝试打开'OS.py'这个文件,而是会在每个文件夹里查找名为'OS'的文件,以及可能的扩展名。在Windows上,这个搜索可能会返回名为'os'的文件,但这些文件会被立即过滤掉,不予考虑。

如果我没记错的话,这种行为随着时间的推移有所变化:很早以前的Python版本在Windows上导入模块时会忽略大小写,后来变成了警告,现在则直接忽略它们。

想了解更多信息,可以查看http://www.python.org/dev/peps/pep-0235/(不过我不知道这个信息是否完全最新)。

撰写回答