1. 程式人生 > >【Python】 sys.path(環境變數)與__init__.py

【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

更多閱讀

參考