要解决这个问题,首先要了解关于python搜索包的机制,在这篇博客里讲的很清楚。
在这篇博客里提出的第一种解决办法中,我发现如果每个文件都要写入以下代码,这样有些麻烦。下面的代码目的是将项目根目录加入到sys.path模块中。
#########################################################
#将根目录加入sys.path中,解决命令行找不到包的问题
import sys
import os
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.append(rootPath)
#########################################################
因此,我在每个目录下的__init__.py中加入上述代码,这样,在该目录下的py文件通过引入__init__.py之后,就不用在每个文件里写入上述代码了。
举个例子:
我在linux环境下执行python3 train.py时,出现了无法找到自定义模块的情况。train.py在DL这个目录下,那我就在DL目录新建了一个__init__.py文件,加入以上代码后,在train.py的头部from __init__ import *
之后,在linux下再次python3 train.py之后就没有问题。
其原因很简单,在了解python搜索包机制之后,知道了python没有在IDE环境下时,是从要执行的.py文件开始向下搜索包。因此,init.py与要执行的.py文件在同个目录下,就可以搜索到__init__.py的所有内容了,也就可以把项目根目录加入到sys.path的模块路径里。
另外,我又搜了一下sys.path是什么,在这个链接(同样有讲到不同目录下py文件引入的问题)中找到了以下答案:python中import某个A模块时,首先会从python的内置模块中查找是否含有该模块的定义若未查询到会从sys.path对应的模块路径查询是否含有对应模块的定义,如果搜索完成依然没有对应A模块时则抛出import的异常。
看了这段话后就知道了,为什么把根目录加到sys.path模块里会有效。
总结的有点乱,不过也只是个记录,有时间再修改一下~