Python代码总报错?模块导入乱成一团,包和库傻傻分不清楚

内容分享4天前发布
0 0 0

Python代码总报错?模块导入乱成一团,包和库傻傻分不清楚

学Python的人刚开始都遇到过这个问题:明明照着教程敲代码,为啥提示模块不存在?实则Python的模块、包、库这三样东西看着简单,稍微用复杂点就容易踩坑。我前两天做项目时,两个同事写的模块名字一模一样,结果程序连5+3都算不对数,差点耽误上线时间。搞清楚这些东西怎么运作,能省不少debug的功夫。

模块实则就是个.py结尾的文件。列如你新建mycode.py,里面写了加法函数,那mycode就是个模块。要用别人写好的模块可以直接import,像import math这种。但要注意,import的时候得写全名,列如math.sqrt(9)才能用。要是嫌麻烦想直接用sqrt,就得用from math import sqrt这种方式。不过有时候两个模块里都有叫sqrt的函数,最后会用到后面导入的那个,容易搞混。

要自己制作模块也很简单,就是多写几个.py文件就行。但有个地方特别容易漏:在模块文件最后测试代码的时候,最好用if __name__ == '__main__'这个判断。不然每次别人import你的模块时,测试代码都会自动跑一遍,特别烦。就像我同学写的工具模块,别人一导入就开始打印一百行测试数据,整个项目卡死。

包实则就是文件夹,但要变成Python认的包,必须在里面放个空的__init__.py文件。这样就能把相关模块放一起管理。列如有个calc包,里面有add.py和sub.py两个模块。调用的时候要写成import calc.add,否则直接import add会找不到。还有个要注意的地方,如果在__init__.py里定义了__all__变量,用from calc import *的时候只能导入列表里的模块,其他都不能用。

说到库这个词,实则Python官方文档里很少用,更多是模块和包的组合。列如常用的requests库,实则就是由一堆.py文件和文件夹组成的。有时候下载第三方库会发现里面全是莫名其炒的文件,实则就是在多个包里放了许多模块。安装库的时候pip会自动把这些文件放在Python能找到的路径里。

最近公司项目用了几十个外部库,常常出现版本冲突。列如同时用了两个库,一个需要numpy1.18,另一个要1.20,直接装哪个都会报错。后来发现得用虚拟环境隔离,每个项目自己管自己的依赖。但新手不太敢用virtualenv,怕搞混配置,只能一步步试错。

Python代码总报错?模块导入乱成一团,包和库傻傻分不清楚

还有命名重叠的问题。记得有人把自己文件命名为time.py,结果import time时调用自己的文件,导致sleep()函数完全失效。程序该停的时候疯狂报错,还以为系统坏了。后来改文件名才发现是这么low级的错误。

目前写代码前我都会先检查文件名是否和Python内置模块重复。导入模块时尽量别用from … import *,万一两个模块有同名函数就得挨个查。要是项目太大模块太多,就按功能分包管理,列如把数据库操作的都放db包里,API接口放api包。

Python社区有个不成文规矩,模块名最好用全小写,别用下划线。但许多老代码还是喜爱用大写命名,搞得新人总找错文件。我之前花了两小时才在CapsLock没开的情况下找到一个叫”Config”的模块,由于它应该叫config.py。

调试导入问题时可以用sys.path看Python在哪些目录找模块。如果是公司电脑,有时候安全策略会屏蔽某些路径,导致明明文件在眼前却找不到。这时候只能把文件复制到site-packages目录或者改环境变量,折腾好久。

最后补充个小技巧,用IDE的话记得让软件自动同步项目结构。上次我的PyCharm没识别新创建的包,结果import老是404,重启一下就正常了。总的来说,模块管理不是技术难题,更多是细节上的细心,就像整理书桌一样,东西放对位置才能顺手。

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...