下面的模塊test1_import中有兩個文件t1.py和t2.py
t1.py的內容如下:
from . import t2
def t1():
t2.t2()
if __name__ == '__main__':
t1()
t2.py的內容如下:
def t2():
print("我是test1_import文件夾下的t2")
如果你在t1.py下運行代碼,就會報錯:
from . import t2
ImportError: cannot import name 't2'
原因其實很簡單,首先我們要搞清楚Python是如何搜索模塊的
Python模塊的搜索路徑:
- 當前主模塊(就是啓動文件)運行所在目錄
- 環境變量所表示的列表
- python默認安裝路徑
可以使用下面的方式查看搜索路徑列表:
import sys
print(sys.path)
__name__
表示模塊名,在啓動文件中使用相對導入時,__name__ = '__main__'
,所以這會去尋找__main__.t2
這個模塊,很顯然文件夾中是沒有這個模塊的,就會報錯。
如果t1不作爲主模塊(啓動文件),那麼導入t1模塊時,__name__ = test1_import.t1
,即模塊名,這是Python區別主模塊和導入模塊的方式。
在運行t1文件的時候,Python會將其所在目錄加入到搜索路徑中,這裏也就是./test1_import/
會在sys.path
列表中,你想使用t2模塊,不使用相對導入就可以了,即import t2
。
總結:python應用程序的主模塊(啓動文件)應該總是使用絕對導入。
如何創建一個較好的Python項目文件夾