美文网首页
python3.0中的包相对导入问题

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

作者: 光的文明 | 来源:发表于2017-11-03 10:43 被阅读223次

    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是可以找的到的。

    相关文章

      网友评论

          本文标题:python3.0中的包相对导入问题

          本文链接:https://www.haomeiwen.com/subject/qyzzpxtx.html