python中的导包问题

一、问题描述

从github上down下来gemma_pytorch,在pycharm上打开使用时发现model.py的导包问题

图1 model.py中的导包
图2 目录结构

 

明明是同级目录,按理说能直接导入,直接能写import tokenizer呀,为什么要写 from gemma import tokenizer呢?(config.py也一样)

二、导包机制

1.导包的搜索路径

python在解释import命令时,会有相应的搜索机制来检查要导入的模块或包能不能搜索到。以图3所示项目结构为例

图3 示例结构

规则是:

(1)先从当前文件所在目录搜索。.件只能导py文入同级的另一.py文件和包。

首先明确的一点,要想import某个模块或包时就先得让python"看见""找到"要导入的模块。 

C:\E\package目录下只有四个东西,两个文件夹,两个py文件,文件夹里的东西是看不见的。所以demo.py导入时,只能导入file_package、test_package、demo2。

你要说我import file_package.file1成功了呀,那是因为你用了"."引导符,我这里谈的只是import 名字(没有点),不信你直接在demo.py敲import file1是报错的。

其次把导包的路径别理解成目录之间的包含关系。C:\E\package和C:\E\package\file_package是两个不同的目录。import file_package不会把这个文件夹里的所有东西都导进去,相当于只是导入了空包,空纸箱子。那这样有啥用呢?这样做一般是初始化用,一般大型项目的包会有__init__.py,导包会执行这个文件。比如深度学习框架pytorch,一般用特定功能块时直接 import torch.nn就好了,为什么还要import torch?就时为了用init里的初始化的东西。

(2)sys.path搜索

就好比你找东西,先从附近找(规则一),找不到了再按可能出现的位置找(本条规则)。sys.path是个列表,元素是导包的搜索路径。当前文件所在目录找不到就按sys.path里的路径挨个找。比如,我要在demo.py中导入file1,一是通过引导符import file_package.file1,二是我把file1所在目录C:\E\package\file_package通过sys.path.append()加进去,我就直接可以import file1

2.pycharm中的导包

在你down下一个项目时,pycharm会把项目所在的根目录添加进sys.path,里面的子文件夹目录不会添加(其实其他的IDE也是这样),比如当我在pycharm第一次打开项目时只会把C:\E\package加进去。所以出现导包错误就考虑sys.path问题。当然pycharm还可以把文件夹设为source root来解决。其他的就按上面说过的导入就行。

三、连锁导包

demo.py中impfile_package.file1,但是file1.py中有import file2,这时会报错没有file2模块,不对啊,file1和file2明明是同级的为什么导不进去?这是把导入关系搞错了。

多个文件相互import时理解成拼接,所起demo.py的内容是这样的:

 执行import file_package.file1时把file1.py的内容粘贴过来,而file1中有一句import file2,但是demo.py在看见这句话的时候会按前面说的规则找,发现找不到就报错了。解决办法:(1)把file2所在目录添入sys.path(2)file1的import改成from file_package import file2

解释下第二个解决办法的原因:demo.py看见file_package.file1时,发现同级目录中有file_package,而看见import file2时找不到,所以用from file_package import file2就能先看见file_package进而找到file2

写在末尾

我的第一篇博客纪念一下,如果读者有什么问题请在评论区指出来,虚怀若谷, 不吝赐教。如果你有导包问题也请发出来,我也会解答,相互学习。

  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值