Chinaunix

标题: 说说Python的模块和程序命名的注意事项 [打印本页]

作者: wzhuzhu    时间: 2010-04-21 23:48
标题: 说说Python的模块和程序命名的注意事项
今天我遇到了一个非常奇怪的问题,问题是这样的:

我写了一个邮件和传真互相转化的程序,写了一个模块名称为mailfax。

然后我写了一个python程序/tmp/mailfax.py内容如下:

[python]
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import os
import sys
# 注: 我的mailfax模块程序放置在/usr/local/binwen/app-modules目录下面
sys.path.append('/usr/local/binwen/app-modules')

from mailfax import Mail
from mailfax import Fax
from mailfax import common

def main():
    print "mailfax"

if __name__ == "__main__":
    main()
[/python]

然后执行:

[bash]
#python ./mailfax.py
Traceback (most recent call last):
  File "./mailfax.py", line 7, in <module>
    from mailfax import Mail
  File "/media/efs/var/Spam-virus/bin/mailfax.py", line 7, in <module>
    from mailfax import Mail
ImportError: cannot import name Mail
[/bash]

始终提示不能导入模块,可是没有任何问题呀???

我想啊想,最后发现了在/tmp下面生成了一个文件/tmp/mailfax.pyc

到这里我终于明白是怎么会事情了,解释如下:

#----------------------------------------------------------------------------------------

Python在导入模块的是有一个搜索路径和优先级的问题:

当前路径 (以及从当前目录指定的sys.path),

然后是 PYTHONPATH,然后是python的安装设置相关的默认路径。

正因为存在这样的顺序,如果当前 路径或PYTHONPATH中存在与标准module同样的module,

则会覆盖标准module。

#----------------------------------------------------------------------------------------

我由于命名了一个文件mailfax.py,而mailfax.py里面又导入了mailfax包,所以出现了上面的问题。

我们在用Python写程序的时候对程序进行命名的时候注意不要使用程序中的包或者模块名作为程序的名称。

问题到此结束,终于知道该问题最终产生的原因了。该文章写出来希望能对大家有所帮助。

老婆催了好几次要睡觉了,走了......
作者: smallfish_xy    时间: 2010-04-22 10:38
文件名啥的最容易误解了。。。。。更有甚者喜欢起个跟系统模块一样的名字。。。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2