基本概念: python
sys.path指定用於模塊搜索路徑的字符串列表。 linux
它根據環境變量PYTHONPATH進行初始化,再加上安裝時的默認值。 app
>>> sys.path python2.7
['', '/opt/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg', '/opt/lib/python2.7/site-packages/SOAPpy-0.12.22-py2.7.egg', '/opt/lib/python2.7/site-packages/defusedxml-0.4.1-py2.7.egg', '/opt/lib/python2.7/site-packages/wstools-0.4.3-py2.7.egg', '/opt/lib/python2.7/site-packages/docutils-0.12-py2.7.egg', '/opt/lib/python2.7/site-packages/suds-0.4-py2.7.egg', '/opt/lib/python27.zip', '/opt/lib/python2.7', '/opt/lib/python2.7/plat-linux2', '/opt/lib/python2.7/lib-tk', '/opt/lib/python2.7/lib-old', '/opt/lib/python2.7/lib-dynload', '/opt/lib/python2.7/site-packages'] spa
此列表的第一項path[0],在程序啓動時初始化,是包含調用Python解釋器的腳本的目錄。 code
若是腳本目錄不可用(例如,解釋器以交互方式調用或腳本是從標準輸入讀取),path[0]是空字符串,表示Python首先搜索當前目錄中的模塊。 orm
注意腳本的目錄在依據PYTHONPATH生成的結果以前插入。 xml
修改path: 進程
一個程序能夠根據它本身的目的自由地修改paht列表。 ip
場景:在實際開發中,默認包含了當前目錄爲搜索路徑,因此,當前目錄下的模塊和子模塊都可以正常訪問。
可是若一個模塊須要import平級的不一樣目錄的模塊,或者上級目錄裏面的模塊,就能夠經過修改path來實現。
修改path經常使用兩種方法:
1. 即時生效的方法,就是在模塊裏面修改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
最好加個判斷,避免重複加入。
2. 在site-packages/ 增長路徑,這種方法一勞永逸, 簡單暴力。
舉個例子,將/tmp/增長到sys.path