我们从切换到a/b
这个路径下, 执行python.exe ./main.py
命令开始
案例: a/b/main.py
导入a/package
这个包
if __name__ == "__main__":
# 报错 ModuleNotFoundError: No module named 'package'
import package
package
?或者说, 什么样的[包/模块]python可以正常导入?很容易知道, 例如: import time
、import 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模块中如何添加路径?