python3.0中的包相对导入问题

python中的相对导入是比较复杂的,在python3.0中导入方式较python2.x产生了比较大的改变。在python2.x中若在文件中导入一个包例如:import demo。python解释器会先在这个文件所在的包中搜索是否存在一个名叫demo的模块,若没有找到再从cwd(当前工作目录current work directory)以及sys.path等中寻找是否存在一个叫做demo的模块。而在python3.0中搜索策略变了,同样是import demo。python解释器在3.0版本中仅仅会在cwd和sys.path中搜索是否有一个叫demo的模块,若找不到则报错,就是说即使demo.py和写import demo的文件在同一个包中在3.0版本的python中也是搜索不到的(前提是cwd和sys.path的路径中均不包含demo.py所在的目录或者说包)

当然,在eclipse中这种限制似乎不那么明显:在同一个包中的任意一个py文件中import同一个包中的其他模块都能顺利运行。这是因为eclipse在运行一个模块时自动会把cwd改到这个运行模块所在的目录,因此就可以很正常的访问到这个目录下的其他模块。

试想这样的一个情景:在.../src/demo23下有两个文件__init__.py,demo1.py和demo2.py。在demo1.py中

import demo2。如果我们把cwd改动到...src/demo23中运行demo1.py这无疑是没有任何问题的。但是,如果我们把cwd改动到.../src(源目录的上一层)然后import demo23.demo1(实际就是运行demo1)那么此时就会出错,因为运行到demo1的import demo2的时候由于我们的版本是3.0,因为他的搜索策略就是搜索cwd和sys.path中是否存在一个叫demo2的模块而不会去搜索demo23这个包中是否存在demo2。很明显最后什么也不会找到,所以这样就会导致错误。那么怎么改这个错误呢?在demo1.py中把import demo2改为from . import demo2,这样就显式地指定了采用相对导入,相对的是demo1.py(也就是写from . import demo2这句话的这个文件)所在的包或者说目录来搜索demo2,而不会再去搜索cwd或者sys.path。当然,这时如果我们把cwd改为.../src/demo23然后import demo1(运行demo1)或者直接双击demo1.py运行就会导致错误,这是因为此时的cwd已经在包内了,demo1.py中from . import demo2这句话就会导致错误,改成import demo2就会修正错误,因为此时cwd中搜索demo2是可以找的到的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 用 python 解释器来编程从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了。 为此...
    chen_000阅读 3,508评论 0 3
  • 类 类的概念在许多语言中出现,很容易理解。它将数据和操作进行封装,以便将来的复用。 模块 模块,在Python可理...
    随风化作雨阅读 5,871评论 0 5
  • Python类、模块、包的区别 类类的概念在许多语言中出现,很容易理解。它将数据和操作进行封装,以便将来的复用。模...
    周倜吉阅读 10,659评论 0 3
  • 模块 函数可以复用代码。如果想复用一系列的函数怎么办?如你所想,答案就是模块。有很多写模块的方法,但是最简单的还是...
    今年说话算话阅读 2,890评论 0 0
  • 文/泥璐 01 前两天,我弟星期回家,我妈破天荒地扯着我弟要和我视频。 打开视频的一刹那,镜头的那边黑咕隆咚的,啥...
    泥璐阅读 13,701评论 273 507

友情链接更多精彩内容