Python脚本运行时出ImportError: cannot import name statsd,Shell中为何正常?
解决ImportError: cannot import name statsd的问题
这问题其实是个经典的模块命名冲突导致的,我来给你拆解清楚:
问题根源
你的脚本文件名是datadog.py,刚好和你要导入的第三方模块datadog同名了!
当你执行python datadog.py时,Python会把当前脚本所在目录放到模块搜索路径的最优先级位置。这时候你写from datadog import statsd,Python会误以为你要导入当前目录下的datadog.py(也就是你自己写的这个脚本),而不是通过pip安装的官方datadog模块。但你的脚本里根本没定义statsd,自然就抛出了ImportError。
而在Python Shell里能成功导入,是因为Shell的模块搜索逻辑不同:要么你启动Shell的目录里没有同名的datadog.py,要么即使在同一个目录,Shell第一次导入的是系统site-packages里的正确模块,不会触发循环导入自身的情况。
解决方案
- 修改脚本文件名:把你的脚本改成和datadog模块不重名的名字,比如
datadog_metrics.py或者my_datadog_script.py。 - 清理缓存文件:如果当前目录下生成了
datadog.pyc(Python的字节码缓存文件),一定要删掉它,避免缓存影响后续执行。
改完之后再执行你的脚本,应该就能正常导入statsd了。
内容的提问来源于stack exchange,提问作者Sa Oh
相关产品推荐
相关产品推荐

