免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1958 | 回复: 1
打印 上一主题 下一主题

说说Python的模块和程序命名的注意事项 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-21 23:48 |只看该作者 |倒序浏览
今天我遇到了一个非常奇怪的问题,问题是这样的:

我写了一个邮件和传真互相转化的程序,写了一个模块名称为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写程序的时候对程序进行命名的时候注意不要使用程序中的包或者模块名作为程序的名称。

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

老婆催了好几次要睡觉了,走了......

论坛徽章:
0
2 [报告]
发表于 2010-04-22 10:38 |只看该作者
文件名啥的最容易误解了。。。。。更有甚者喜欢起个跟系统模块一样的名字。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP