这是一个创建于 4387 天前的主题,其中的信息可能已经有所发展或是发生改变。
是这样的, 今天下午写代码时遇到一个非常奇怪的bug, 与我原有对python的认知冲突, 实在不理解,所以花了许多时间才找到这个bug, 下面我把它用简单的方式重现出来, 大家讨论一下
首先, 在项目文件夹里面有以下几个文件:
test.py
model/Model.py
model/__init__.py
model/content/__init__.py
test.py中只有一句话: import model
然后model/__init__.py 中的内容为:
print __file__ # 打印当前文件路径
from Model import ModelData
import content
其中print是为了调试看得, 另外两句一句都不能少
然后model/Model.py文件中的内容如下:
class Model:
pass
class ModelData:
pass
声明两个class而已
最后一个文件 model/content/__init__.py 中的内容如下:
from .. import ModelData
整个代码的逻辑就是,test import了model, 而model又import了model/content
model/content 又 import ModelData, 而这个ModelData是在model/__init__.py中import的
看起来像是一个循环,其实并不是, 也没有矛盾, 代码能正常运行, 运行test.py文件后输出:
***/model/__init__.pyc
嗯,这是正常的, 然后我们把model/content/__init__.py的内容改为:
from Model import ModelData
然后再运行test.py, 会抛出以下异常:
from Model import ModelData
ImportError: No module named Model
嗯,这也是正常的, 因为第二种写法确实是错的
但是,bug来了, 第二种写法如果是在我这种特殊环境中运行就不正常了,
我用debian虚拟机写程序, 但是为了代码安全, 我把代码放到mac的文件系统上,然后通过共享文件夹的方式共享给debian系统。
然后我在debian下运行mac系统的python文件, 就不会抛出异常! 而出现以下的输出:
***/model/__init__.pyc
***/Model/__init__.pyc
尼玛, print语句运行了两次, 也就是说model被导入了两次! 并且第一次导入时初始化的数据会被第二次覆盖, 也就是这个特性导致我花了好几个小时来处理这个bug
也就是说, 如果你像我一样在区分大小写的系统上运行程序, 但是代码放在不区分大小写的系统上, 那么注意了, 像 from ABC import *** 这样的代码, 如果你的ABC和abc分别表示不同的意思, 那么就可能出现应该抛出异常但是没有抛出而引起其它bug的可能
5 条回复 • 1970-01-01 08:00:00 +08:00
|
|
1
wynemo 2012-12-25 00:44:23 +08:00
test.pymodel/ Model.pymodel/ __init__.py其实你要说明问题只要这三个文件 就可以了嘛 test.py里写from Model from Model 看会不会抛异常 至于有的系统区分大小写 有的不区分 分别找一个系统 建立一模一样的代码 (比如上面的) 各自跑下 看啥情况
|
|
|
2
mrluanma 2012-12-25 02:09:43 +08:00
正如1楼所言,这是因为Mac的HFS文件系统默认配置是文件名大小写不敏感的。
|
|
|
3
sdjl 2012-12-25 21:42:00 +08:00
@ wynemo 嗯 好像是, 昨天被bug搞累了。。。。。 尝试了, 仅在使用虚拟机且代码放到mac系统里才会出现这个情况
|
|
|
4
ledzep2 2012-12-25 21:55:14 +08:00
大小写从来都是个需要注意的问题....
|
|
|
5
ledzep2 2012-12-25 21:55:27 +08:00
但是这不是python的问题
|