1. 程式人生 > >關於Python匯入模組的搜尋路徑以及優先順序問題(Search path for python import module )

關於Python匯入模組的搜尋路徑以及優先順序問題(Search path for python import module )

背景

  • 這裡都是廢話,別看!!!

    伺服器是多使用者使用,都對規範化操作沒啥經驗,多次出現多使用者、多版本管理問題。我希望我的使用者環境不受別人操作的干擾,在不斷的學習中也發現了一些較好的辦法,例如使用Virtualenv(venv)。但我一開始就是使用的系統預設安裝的Python,本著坑還是要填的原則,暫時先把問題解決,再想著用新方法。

  • 背景知識,往這看!
    Python import module 的搜尋路徑由sys.path指定,實質為一個列表,列表索引先後決定搜尋優先順序。在呼叫python時根據PYTHONPATH和安裝Python時的位置來初始化,大部分部落格均有提及的是:sys.path
    列表第一優先順序為當前執行指令碼的目錄,常顯示為' ';第二優先順序為PYTHONPATH;第三優先順序為安裝位置。這種說法並不完善,也是這篇部落格重在強調的,具體看文末總結。

問題

  • System:ubuntu16.04
  • Software:python2.7(系統預裝)
  • 問題描述:
    在執行.py或者使用python互動環境import cv2時始終匯入的是某些blog在import cv2出錯時推薦安裝的opencv-python(前提我已經設定好了PYTHONPATH)而不是我自己原始碼編譯的opencv。初步懷疑是搜尋路徑的優先順序問題,但是PYTHONPATH優先順序確實比預設安裝路徑要高,費解!
  • 解決步驟

    1. 將自己opencv的安裝路徑加入到最高優先順序(list的第一個元素),驗證是否為搜尋路徑優先順序導致。

      sys.path.insert(0,'${opencv_install}/lib/python2.7/dist-packages/')
      import cv2
      print cv2.__file__

      結論:能正確找到自己編譯的opencv,確實是優先順序問題,新的問題來了PYTHONPATH優先順序確實比預設安裝路徑要高,為什麼還會找到預設安裝路徑的opencv-python?

    2. 打印出sys.path檢查,發現在當前路徑' 'PYTHONPATH中插入了一部分路徑,這部分路徑中居然含有'/usr/local/lib/python2.7/dist-packages'

      ,罪魁禍首找到了,預設安裝路徑在PYTHONPATH前面,所以每次都找到opencv-python這個模組。

    3. 這裡寫圖片描述
      注意看黃底部分,有一個site模組也會在啟動時會自動載入一些路徑到sys.path,該模組通過讀取指定目錄中的name.pth檔案來新增對應路徑!!!
      關於site模組的細節不想寫了,有興趣的自己看官方文件,因為寫文件太耗時了,寫了也不一定有人會看,看了也不一定會關注…..

    4. 解決問題
      /usr/local/lib/python2.7/dist-packages/easy-install.pth檔案中找到了被新增PYTHONPATH之前的'/usr/local/lib/python2.7/dist-packages',把這一句註釋掉,問題解決!

總結

  • 問題:
    在系統Python的安裝位置的/usr/local/lib/python2.7/dist-packages/easy-install.pth檔案中有一行'/usr/local/lib/python2.7/dist-packages'被新增在PYTHONPATH之前,導致import時只能找到pip安裝的模組,自行編譯安裝在其他地方的模組找不到!
  • 經驗:
    上接背景知識,Python按照sys.path列表搜尋模組,site模組也會自動將name.pth中的路徑載入在sys.path中,且可能位於PYTHONPATH之前。
  • 這個問題也啟發我們,除了PYTHONPATH,我們還可以利用上面site模組作用,通過在指定位置新增name.pth來指定自己編譯的模組路徑,當然是建議在自己使用者目錄下~/.local/lib/python2.7/site-packages/啦!

相關推薦

關於Python匯入模組搜尋路徑以及優先順序問題Search path for python import module

背景 這裡都是廢話,別看!!! 伺服器是多使用者使用,都對規範化操作沒啥經驗,多次出現多使用者、多版本管理問題。我希望我的使用者環境不受別人操作的干擾,在不斷的學習中也發現了一些較好的辦法

python新增模組搜尋路徑和包的匯入

方法一:函式新增1 import sys2 檢視sys.path3 新增sys.path.append("c:\\")方法二:修改環境變數w使用者可以修改系統環境變數PYTHONPATH方法三:增加.pth檔案,推薦!在site-packages新增一個路徑檔案,如mypkp

Python模組搜尋路徑

一種語言要使用到外部庫(模組) 時必然會涉及到從哪裡以及按何順序載入依賴,就像 LD_LIBRARY_PATH, CLASSPATH 那樣,Python 也有其預設的模組搜尋順序, 依序找到想要的模組即停止。Python 中 sys.path 返回的列表包含了模組搜尋的順序,我們可以程式中修改該列表

python 匯入模組使用程式匯入模組,並簡單對錯誤處理

在python 中如果需要匯入一些模組,可以使用import xxx 或者使用from xx import xx 。只有這一種方式嗎,當然不是,還有一種就是使用程式碼將一些模組匯入。使用到的是 ` importlib ` 這個模組。 一般用法: import importlib imp

Python新增預設模組搜尋路徑

寫這篇部落格主要原因:由於本人電腦安裝比較亂,python版本安裝了好幾個。當我用pip3 install moviepy命令安裝moviepy模組時,它自動的把該庫安裝到了python3.7的環境下,而我的python3預設的是python3.6.所以在終端

Python新增預設模組搜尋路徑;取檔案所在目錄的上一級目錄

為Python新增預設模組搜尋路徑 方法一:函式新增 1 import sys 2 檢視sys.path 3 新增sys.path.append(“c:\”) 方法二:修改環境變數 w使用者可以修改系統環境變數PYTHONPATH 方法三:增加.p

Python Import機制-模組搜尋路徑(sys.path)、巢狀Import、package Import

模組的搜尋路徑 在一個模組被匯入時,PVM會在後臺從一系列路徑中搜索該模組,其搜尋過程如下: 1、在當前目錄下搜尋該模組; 2、在環境變數PYTHONPATH中指定的路徑列表中依次搜尋; 3、在python安裝路徑中搜索       事實上,PVM通過變數s

(轉)為Python新增預設模組搜尋路徑

原文出處:https://www.douban.com/note/334738164/ 方法一:函式新增1 import sys2 檢視sys.path3 新增sys.path.append("c:\\")方法二:修改環境變數w使用者可以修改系統環境變數PYTHONPATH方法三:增加.pth檔案,推薦

Python Import機制備忘-模組搜尋路徑(sys.path)、巢狀Import、package Import

最近在看《Python原始碼剖析》,對Python內部執行機制比以前瞭解的更深入了,感覺自己有機會也可以做個小型的動態指令碼語言了,呵呵,當然是吹牛了。目的當然不是創造一個動態語言,目的只有一個:更好的使用Python。看到模組匯入那塊的時候,終於對模組匯入機制比較瞭解了,以

python日期模組datetime常用操作總結字串與datetime物件互轉、日期差值計算、時間戳獲取、時間陣列生成等

     在python中,自帶的datetime和time兩個時間模組在平時的使用中可以滿足我們絕大多數的需求,但是由於缺乏對這些模組深度的瞭解和使用,導致平時能夠使用到的時間功能十分有限,例如:對於time模組,我的使用幾乎就是停留在程式執行時間的統計和時間戳生成這

python匯入模組交叉引用

   實際專案中遇到python模組相互引用問題,查資料,終於算是弄明白了。     首先交叉引用或是相互引用,實際上就是匯入迴圈,關於匯入迴圈的詳細說明,可見我摘自《python核心程式設計》第二版的摘抄:     附錄給了一種解決交叉引用的方法,試了,不行,但關於

python功能模組之psutil------ Linux效能CPU、磁碟、記憶體、網絡卡監控

採集系統的基本效能資訊包括CPU、記憶體、磁碟、網路等,可以完整描述當前系統的執行狀態及質量。psutil模組已經封裝了這些方法,使用者可以根據自身的應用場景,呼叫相應的方法來滿足需求,非常簡單實用。 (1)CPU資訊 Linux作業系統的CPU利用率有以下幾個部分:

python 匯入模組和解決檔案控制代碼找不到問題

如果你退出 Python 直譯器並重新進入,你做的任何定義(變數和方法)都會丟失。因此,如果你想要編寫一些更大的程式,為準備直譯器輸入使用一個文字編輯器會更好,並以那個檔案替代作為輸入執行。這就是傳說

R+python︱XGBoost極端梯度上升以及forecastxgb預測+xgboost迴歸雙案例解讀

      XGBoost不僅僅可以用來做分類還可以做時間序列方面的預測,而且已經有人做的很好,可以見最後的案例。       應用一:XGBoost用來做預測 ———————————————————————————————————————

Python匯入模組的幾種姿勢(常規匯入, 相對匯入, 可選匯入, 本地匯入)

作為一名新手Python程式設計師,你首先需要學習的內容之一就是如何匯入模組或包。但是我注意到,那些許多年來不時使用Python的人並不是都知道Python的匯入機制其實非常靈活。在本文中,我們將探討以下話題: 常規匯入(regular imports) 使用from

python 分離檔名和路徑 以及 分離檔名和字尾

分離路徑和檔名: os.path.split() 區分檔案的名字和字尾: os.path.splitext() import os file_path = "D:/test/test.py" (filepath, tempfilename) = os.path.

Python——爬取人口遷徙數據以騰訊遷徙為例

map car img all spa ima tps .sh compile 說明: 1.遷徙量是騰訊修改後的數值,無法確認真實性。 2.代碼運行期間,騰訊遷徙未設置IP屏蔽和瀏覽器檢測,因此下段代碼僅能保證發布近期有效。 3.代碼功能:爬取指定一天的四十個城市左右的遷徙

洛谷P3371單源最短路徑Dijkstra版鏈式前向星處理

jks 沒有 style bool while add 是什麽 最短 短路徑 首先講解一下鏈式前向星是什麽。簡單的來說就是用一個數組(用結構體來表示多個量)來存一張圖,每一條邊的出結點的編號都指向這條邊同一出結點的另一個編號(怎麽這麽的繞) 如下面的程序就是存鏈式前向星。(

Python Turtle庫畫b站logo張野 付博林組

bili goto 一點 fill orm pre rtl scree get 視頻就在這裏 由於不知道很多函數只等自己一點一點的試??嗶哩嗶哩 (゜-゜)つロ 幹杯~ import turtle turtle.speed(6) turtle.screensize

【Android studio安裝】最新Android studio安裝教程以及問題emulator: ERROR: unknown virtual device name

安裝Android studio之前需要安裝JAVA,JAVA安裝教程網上很多本文不再陳述。可以參考連結: https://blog.csdn.net/u012934325/article/details/73441617/ 1、需要下載檔案 Android studio下載連結:ht