簡體   English   中英

Python 2.7和3.4之間的包導入差異

[英]Difference in package importing between Python 2.7 and 3.4

對於此目錄層次結構:

.
├── hello
│   ├── __init__.py
│   └── world
│       └── __init__.py
└── test.py

和Python源文件:

test.py:

if __name__ == '__main__':
    import hello

你好/ __ init__.py:

import world

你好/世界/ __ init__.py:

print("yes you win")

使用Python 3.4運行test.py會拋出ImportError說找不到模塊world ,但是使用Python 2.7一切都很好。

我知道在搜索導入的模塊時會引用sys.path ,因此將目錄hello添加到sys.path消除錯誤。

但是在Python 2.7中,在導入world之前,目錄hello也不在sys.path中。 是什么導致這種差異? 是否在Python 2.7中應用了遞歸搜索策略?

Python 3使用絕對導入(參見PEP 328 ,@ user2357112指出)。 缺點是Python 3從每個sys.path條目的根目錄進行搜索,而不是首先查詢模塊的目錄,就好像它是sys.path中的前置條目一樣。

要獲得您想要的行為,您可以:

  • 明確使用相對導入: from . import world hello包中from . import world
  • 使用絕對導入: import hello.world

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM