關於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
優先順序確實比預設安裝路徑要高,費解! 解決步驟
將自己opencv的安裝路徑加入到最高優先順序(list的第一個元素),驗證是否為搜尋路徑優先順序導致。
sys.path.insert(0,'${opencv_install}/lib/python2.7/dist-packages/') import cv2 print cv2.__file__
結論:能正確找到自己編譯的opencv,確實是優先順序問題,新的問題來了
PYTHONPATH
優先順序確實比預設安裝路徑要高,為什麼還會找到預設安裝路徑的opencv-python?打印出
sys.path
檢查,發現在當前路徑' '
和PYTHONPATH
中插入了一部分路徑,這部分路徑中居然含有'/usr/local/lib/python2.7/dist-packages'
PYTHONPATH
前面,所以每次都找到opencv-python
這個模組。-
注意看黃底部分,有一個site
模組也會在啟動時會自動載入一些路徑到sys.path
,該模組通過讀取指定目錄中的name.pth
檔案來新增對應路徑!!!
關於site
模組的細節不想寫了,有興趣的自己看官方文件,因為寫文件太耗時了,寫了也不一定有人會看,看了也不一定會關注….. - 解決問題
在/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