問題引入
先看兩張圖
不言自明,python解釋器運(yùn)行module2.py腳本司澎,然后試圖從package1包下的module1模塊中引入變量a物独,但是失敗了,因?yàn)閜ython解釋器找不到package1的位置
那么問題來了备闲,為什么會(huì)找不到晌端,python解釋器是去哪兒搜索模塊的?
實(shí)際上python解釋器從以下三個(gè)位置按順序搜索模塊
1.執(zhí)行python module2.py時(shí)恬砂,腳本module2.py所在的目錄
2.環(huán)境變量 PYTHONPATH 表示的目錄列表
3.python 默認(rèn)安裝路徑
這些位置都存在sys.path變量中咧纠,我們打印出來看看
sys.path是一個(gè)列表,顯而易見泻骤,module1不在python解釋器的搜索路徑中漆羔。
但原理知道了,辦法也就有了
解決辦法
- 修改PYTHONPATH環(huán)境變量
我們把project的路徑添加到PYTHONPATH環(huán)境變量中瞪讼,那么python解釋器就可以在project路徑下找到package1包钧椰,進(jìn)而成功導(dǎo)入變量a
注意:
1.1如果執(zhí)行from project.package1.module1 import a
仍然會(huì)報(bào)錯(cuò),因?yàn)榇藭r(shí)python解釋器會(huì)去project下面找project符欠,當(dāng)然找不到
1.2 按順序搜索意味著一旦搜到指定模塊嫡霞,解釋器就會(huì)停止搜索,所以如果你package2包下面創(chuàng)建time.py腳本希柿,然后在module2.py中import time
诊沪,那么引入的將會(huì)是你自定義的time模塊
2.向sys.path中加入project的路徑
首先刪除PYTHONPATH環(huán)境變量
set PYTHONPATH=
但用這種方法,如果再來一個(gè)package3/module3.py曾撤,豈不是還要寫一次sys.path.append端姚,這顯然是不應(yīng)該的
3.project項(xiàng)目的啟動(dòng)文件放在proeject的子目錄下
例如,由project/run.py啟動(dòng)項(xiàng)目
此時(shí)run.py所在目錄即package的絕對(duì)路徑被加入到sys.path挤悉,各package可以被直接導(dǎo)入
4.使用python -m
python -m 的意思是 把模塊當(dāng)腳本來運(yùn)行
這種方式把你輸入命令的路徑加入到sys.path
而直接啟動(dòng)腳本的方式 即 python module2.py會(huì)把腳本所在路徑加入到sys.path
learn about module in python,please see
http://www.pythondoc.com/pythontutorial3/modules.html#tut-searchpath