文章目录
- 1问题背景
- 2参考资料及分析
- 3可以兼顾的方法
1问题背景
-
需要在当前文件中导入当前文件的上级目录下某个文件夹中的文件,如下图所示
- 即在
CBOW.py
文件中导入utils\Embedding.py
文件中的类;
- 即在
2参考资料及分析
-
如何将Python的上级目录的文件导入?【from.import】_python导入上级目录下的文件-CSDN博客中的以下内容我觉得是有用的:
-
即如果运行上图中的
CBOW.py
文件,则improved_CBOW
目录就不会被识别成一个包了;此时就算加入sys.path.append("..")
语句,也会报错,因为不是一个包自然找不到上级目录 -
但是如果是像博客中说的,在外面用一个文件来启动程序,则是可以的,如下图所示;此时从
temp.py
执行程序,因此improved_CBOW
目录可以被识别成包,相对路径可以使用,sys.path.append("..")
语句有效,于是可以从utils.Embedding
文件导入类了。 -
因此,我们看到,使用
sys.path.append("..")
语句在一种情况下起作用,在另一种情况下就不起作用;那么我们写程序,肯定是先在类似CBOW.py
的文件中通过if __name__ == "__main__":
进行调试,没有问题了才采用temp.py
的方式调用CBOW.py
;那如果使用sys.path.append("..")
语句则需要来回切换,个人感觉比较麻烦。 -
为了解决这个痛点,这篇博客中提到的另一种使用绝对路径的方法就可以大显身手了:
-
3可以兼顾的方法
-
像博客中说的那样,在
CBOW.py
文件中设置CBOW.py
的上级目录,然后在CBOW.py
文件中执行程序,如下图所示:- 既然此时
improved_CBOW
目录不会被识别成一个包,相对路径不起作用,那就用绝对路径,这种可以找到了; - 然后我们就可以直接导入
utils
目录下的文件以及子文件夹下的其他文件了;尽管这个时候编辑器会有黄色波浪线;
- 既然此时
-
保持上图中的修改,我们再从
temp.py
执行程序,如下图所示,程序也是成功执行没有报错了: -
另外,这样做的好处是,我们将
utils
目录加入到了Python解释器去寻找包的路径集合中,之后在其他文件中导入utils
目录下的文件时也变得很容易,如下图所示:- 在
CBOW.py
文件中还需要导入negativeSamplingLayer.py
文件,该文件也位于utils
目录,自然可以和Embedding
一样直接导入; - 而在导入
negativeSamplingLayer.py
文件时,还需要将negativeSamplingLayer.py
文件中要导入的包给导入进来,例如其中的SigmoidWithLoss.py
文件; - 由于
SigmoidWithLoss.py
文件也位于utils
目录,导入方式就和前述几个一样
- 在
-
综上,采用绝对路径的方法,可以兼顾两种运行方式,且在其他文件中导入相应目录下文件时也变得很方便了。