python import失败原因及解决方案

错误从何而起?

python import失败原因及解决方案_第1张图片

我们从切换到a/b这个路径下, 执行python.exe ./main.py命令开始

案例: a/b/main.py导入a/package这个包

if __name__ == "__main__":
	# 报错 ModuleNotFoundError: No module named 'package'
	import package 

开始分析问题

问题:python为什么识别不到package?或者说, 什么样的[包/模块]python可以正常导入?

很容易知道, 例如: import timeimport random肯定能成功,不管在什么目录下都可以导入。

问题:那么为什么他们能导入?

因为这些[包/模块]的目录进行在sys[包/模块]的sys.path这个列表类型的变量中存在

执行 F:\Document\研究生总汇\interview\algorithm-coding\.leetcode\other\test\a\b>python ./main.py

if __name__ == "__main__":
    import sys
    print(sys.path)
    import package

输出如下:

['F:\\Document\\研究生总汇\\interview\\algorithm-coding\\.leetcode\\other\\test\\a\\b', 
'E:\\MyComputerInstalledSoftwares\\anaconda3\\envs\\jupyterlab\\python39.zip', 
'E:\\MyComputerInstalledSoftwares\\anaconda3\\envs\\jupyterlab\\DLLs', 
'E:\\MyComputerInstalledSoftwares\\anaconda3\\envs\\jupyterlab\\lib', 
'E:\\MyComputerInstalledSoftwares\\anaconda3\\envs\\jupyterlab', 
'E:\\MyComputerInstalledSoftwares\\anaconda3\\envs\\jupyterlab\\lib\\site-packages', 
'E:\\MyComputerInstalledSoftwares\\anaconda3\\envs\\jupyterlab\\lib\\site-packages\\win32', 
'E:\\MyComputerInstalledSoftwares\\anaconda3\\envs\\jupyterlab\\lib\\site-packages\\win32\\lib', 
'E:\\MyComputerInstalledSoftwares\\anaconda3\\envs\\jupyterlab\\lib\\site-packages\\Pythonwin'
]

Traceback (most recent call last):
  File "F:\Document\研究生总汇\interview\algorithm-coding\.leetcode\other\test\a\b\main.py", line 4, in <module>
    import package
ModuleNotFoundError: No module named 'package'

第一个值得关注的点,返回列表的第一个元素为'F:\\Document\\研究生总汇\\interview\\algorithm-coding\\.leetcode\\other\\test\\a\\b',可以发现这个路径,就是我们执行 F:\Document\研究生总汇\interview\algorithm-coding\.leetcode\other\test\a\b>python ./main.py命令时,所处的路径。

结论

因此,我们可知执行的路径会被自动加入sys.path中,并且其中还[包/模块]含一些python自带的工具[包/模块]所处的目录。

这也是为什么同级目录下[包/模块]导入,以及python核心[包/模块]的导入没问题的原因.

开始正式解决问题

分析到此为止,很容易得到解决方案,即, 往sys.path中增加需要扫描[包/模块]的所处目录。

于是得到如下的代码:

if __name__ == "__main__":
    import sys
    # 使用相对路径
    sys.path.append("../..")
    # 或者 使用绝对路径
    sys.path.append("F:\\Document\\研究生总汇\\interview\\algorithm-coding\.leetcode\\other\\test")
    import package
    print("[包/模块]导入成功")

输出:

[包/模块]导入成功

扩展阅读: python[包/模块]扫描路径设置的其它方式

因为上述问题的本质, 是python的[包/模块]扫描路径不全导致的.

但是上述的方式有一个明显的缺点: 程序运行时添加的扫描路径, 因此其它程序需要用到该[包/模块]时, 还是需要重复的写代码添加[包/模块]的扫描路径.

文章和视频看一个即可, 更推荐看视频

视频: 设置python模块搜索路径的几种方式

文章: python中添加路径_python模块中如何添加路径?

你可能感兴趣的:(日常BUG,python,开发语言)