【Python】 sys.path(環境變數)與__init__.py
sys.path(環境變數)
介紹
指定模組的搜尋路徑的字串列表。
sys模組包含了與python直譯器和它的環境有關的函式, 裡面有個 sys.path屬性。它是一個list.默然情況下python匯入檔案或者模組的話,他會先在sys.path裡找模組的路徑。如果沒有的話,程式就會報錯。
1. path[0]
此列表的第一項,path[0],在程式啟動時初始化,是包含用來呼叫Python直譯器的指令碼的目錄。如果指令碼目錄不可用(例如,如果直譯器被互動式地呼叫,或者指令碼是從標準輸入讀取的),path[0]是空字串,它引導Python首先在當前目錄中搜索模組。
比如在C:User\chenxi3\Destop\Simplify中有一個testSysPath. py
import sys
print("\n".join(sys.path))
輸出是:
C:\Users\chenxi3\Desktop\Simplify
C:\Python27\DLLs
C:\Python27\lib
C:\Python27\lib\plat-win
C:\Python27\lib\lib-tk
C:\Python27
C:\Python27\lib\site-packages
path[0]是C:\Users\chenxi3\Desktop\Simplify,呼叫python直譯器的指令碼所在的目錄。
如果在命令列中
>>> import sys
>>> print("\n".join(sys.path)
path[0]為空,因為沒有指令碼檔案,也就找不到指令碼檔案所在目錄。
2. 標準庫
lib目錄下(home目錄\pythonXX\lib)
3. 第三方庫
在lib目錄下的site-package目錄下(home目錄\pythonXX\lib\site-packages)
修改path
一個程式可以根據它自己的目的自由地修改path列表。
場景:在實際開發中,預設包含了當前目錄為搜尋路徑,所以,當前目錄下的模組和子模組均可以正常訪問。
但是若一個模組需要import平級的不同目錄的模組,或者上級目錄裡面的模組,就可以通過修改path來實現。
修改path常用兩種方法:
方法一:函式新增
這是即時生效的方法,就是在模組裡面修改sys.path值,這種方法修改的sys.path作用域只是當前程序,程序結束後就失效了。
個人比較推薦這種方法,比較乾淨, 避免一些衝突問題。
比如現在的程式碼目錄結構:
/src/configs/config.py
/src/common/Database.py
假如Database.py期望匯入config. py,則可以增加上級目錄到sys.path列表裡面:
parent_path = os.path.dirname(sys.path[0])
if parent_path not in sys.path:
sys.path.append(parent_path)
import configs.config
最好加個判斷,避免重複加入。
方法二:新增.pth檔案
在site-packages/ 增加一個路徑檔案,如mypkpath.pth,必須以.pth為字尾,將模組的路徑寫進去,一行一個路徑,寫上要加入的模組檔案所在的目錄名稱。這種方法一勞永逸, 簡單暴力。
舉個例子,將/tmp/增加到sys.path
首先cd到指定python的sit-packages/目錄下,然後建立一個檔案,例如test.pth(注意字尾要為.pth),在檔案中增加/tmp/路徑資訊,儲存退出。
python2.7/site-packages/test.pth檔案中新增一條:
/tmp/
方法三:修改環境變數
新增系統環境變數PYTHONPATH,在這個環境變數中輸入相關的路徑,不同的路徑之間用逗號(英文的!)分開。路徑會自動加入到sys.path中。
sys.path與init.py
_ init_ .py檔案將一個資料夾轉化為一個package,這對於建立一個模組的層次結構是很有用的,這樣就可以使用這樣的匯入語句:
import mymodule.cool.stuff
如果沒有package,這樣就不行了。
假如有資料夾mymodule,mymodule下有資料夾cool,cool目錄下有stuff.py指令碼
將環境變數C:\mymodule加到sys.path中,在mymodule目錄下簡歷_ init_ .py裡面寫上import cool(資料夾),在cool目錄下新建_ init_ .py內容為空
執行時,就只需import mymodule.cool.stuff即可。
注:不需要增加子目錄,因為在目錄中我們有_ init_ .py