天天看點

python子產品搜尋路徑常見問題總結

    最近在項目中因為需求原因,需要使用subprocess子產品執行shell腳本來啟動python檔案,結果在子產品導入時出現各種報錯,經過查找發現,原來是在添加子產品搜尋路徑時使用了相對路徑導緻的,再結合之前在子產品搜尋路徑上面遇到的問題,特意将相關内容整理了下。

 當使用import導入子產品時,解釋器首先會在内置子產品中搜尋該子產品。如果沒有找到,将在變量 sys.path 給出的目錄清單中搜尋該子產品。這裡有三個小點需要注意:

 1.用pycharm和python解釋器啟動python檔案時,pycharm會自動将項目的根目錄添加到 sys.path搜尋路徑中,而python解釋器不會.

python子產品搜尋路徑常見問題總結

      如上圖所示,我用pycharm和指令行兩種方式啟動同一.py檔案,并在檔案中列印sys.path,會發現除了腳本所在目錄外,pycharm的子產品搜尋路徑多了'/home/lyz/Desktop/new_VideoFramework2019',即項目的根目錄,這就容易出現在pycharm中開發時導包正常,項目部署時導包出錯的問題.解決辦法就是使用append或insert将項目根目錄添加進sys.path子產品搜尋清單中.

 2.sys.path使用insert和append添加子產品搜尋路徑時,由于解釋器是按照清單的順序查找子產品的,是以需要考慮假如sys.path子產品搜尋路徑中有兩個同名檔案時,想用那個檔案的問題.

 例如将'/home/lyz/Desktop/xxxxxx'目錄添加到sys.path中.

 1.使用insert添加

python子產品搜尋路徑常見問題總結

2.使用append添加

python子產品搜尋路徑常見問題總結

 可以看到使用insert将'/home/lyz/Desktop/xxxxxx'添加到了sys.path的首位,使用append将'/home/lyz/Desktop/xxxxxx'添加到了sys.path的末位.假如你使用append添加完'/home/lyz/Desktop/xxxxxx'目錄,想要導入xxxxxx目錄下檔案a中的函數b,但要是'/home/lyz/Desktop/xxxxxx'目錄前面的任何一個目錄下有同名檔案a,那麼解釋器就會隻在前面目錄下的檔案a找b,要麼出現找不到b的報錯,要麼出現導入你不想要的b的錯誤.

 3.當一個python檔案調用多個python檔案時,那麼被調用的python檔案的子產品搜尋路徑以調用檔案為準,和被調用檔案的實際位置無關.

 1.直接在kill_process檔案中列印sys.path

python子產品搜尋路徑常見問題總結

2.通過manage檔案調用kill_process檔案列印sys.path

python子產品搜尋路徑常見問題總結

可以看到,直接在kill_process檔案中列印sys.path,sys.path的首位是'/home/lyz/Desktop/new_VideoFramework2019/subprocess_swtchi',即kill_process檔案所在位置,而通過manage檔案調用kill_process檔案列印sys.path時,sys.path的首位是'/home/lyz/Desktop/new_VideoFramework2019',即manage檔案所在位置,由此可見當一個python檔案調用多個python檔案時,那麼被調用的python檔案的子產品搜尋路徑以調用檔案為準,和被調用檔案的實際位置無關,是以,假如我們使用相對路徑的方法在sys.path添加子產品搜尋路徑時,一定要注意以啟動檔案所在位置為準.