Python导包问题

1问题背景

  1. 需要在当前文件中导入当前文件的上级目录下某个文件夹中的文件,如下图所示

    1. 即在CBOW.py文件中导入utils\Embedding.py文件中的类;

    在这里插入图片描述

2参考资料及分析

  1. 如何将Python的上级目录的文件导入?【from.import】_python导入上级目录下的文件-CSDN博客中的以下内容我觉得是有用的:

    在这里插入图片描述

    1. 即如果运行上图中的CBOW.py文件,则improved_CBOW目录就不会被识别成一个包了;此时就算加入sys.path.append("..")语句,也会报错,因为不是一个包自然找不到上级目录

      在这里插入图片描述

    2. 但是如果是像博客中说的,在外面用一个文件来启动程序,则是可以的,如下图所示;此时从temp.py执行程序,因此improved_CBOW目录可以被识别成包,相对路径可以使用,sys.path.append("..")语句有效,于是可以从utils.Embedding文件导入类了。

      在这里插入图片描述

    3. 因此,我们看到,使用sys.path.append("..")语句在一种情况下起作用,在另一种情况下就不起作用;那么我们写程序,肯定是先在类似CBOW.py的文件中通过if __name__ == "__main__":进行调试,没有问题了才采用temp.py的方式调用CBOW.py;那如果使用sys.path.append("..")语句则需要来回切换,个人感觉比较麻烦。

    4. 为了解决这个痛点,这篇博客中提到的另一种使用绝对路径的方法就可以大显身手了:

      在这里插入图片描述

3可以兼顾的方法

  1. 像博客中说的那样,在CBOW.py文件中设置CBOW.py的上级目录,然后在CBOW.py文件中执行程序,如下图所示:

    1. 既然此时improved_CBOW目录不会被识别成一个包,相对路径不起作用,那就用绝对路径,这种可以找到了;
    2. 然后我们就可以直接导入utils目录下的文件以及子文件夹下的其他文件了;尽管这个时候编辑器会有黄色波浪线;

    在这里插入图片描述

  2. 保持上图中的修改,我们再从temp.py执行程序,如下图所示,程序也是成功执行没有报错了:

    在这里插入图片描述

  3. 另外,这样做的好处是,我们将utils目录加入到了Python解释器去寻找包的路径集合中,之后在其他文件中导入utils目录下的文件时也变得很容易,如下图所示:

    1. CBOW.py文件中还需要导入negativeSamplingLayer.py文件,该文件也位于utils目录,自然可以和Embedding一样直接导入;
    2. 而在导入negativeSamplingLayer.py文件时,还需要将negativeSamplingLayer.py文件中要导入的包给导入进来,例如其中的SigmoidWithLoss.py文件;
    3. 由于SigmoidWithLoss.py文件也位于utils目录,导入方式就和前述几个一样

    在这里插入图片描述

  4. 综上,采用绝对路径的方法,可以兼顾两种运行方式,且在其他文件中导入相应目录下文件时也变得很方便了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值