1. 程式人生 > 程式設計 >解決python 虛擬環境刪除包無法載入的問題

解決python 虛擬環境刪除包無法載入的問題

專案開發一直在docker的虛擬環境上,遇到了一個問題,就是把虛擬環境的包刪掉(rm -rf xxx)之後,再重新拷貝一個(跟原來包一模一樣的資料夾)進去發現pycharm再也找不到這個包了,後來在同事的幫助下一步步的解決了這個問題:

解決流程:

1.定位問題

在虛擬環境下引入這個包:

#進入虛擬環境
source bin/activate
#1.進入python
#2.引入報錯的包
(xenwebsite-env)[root@aeb02c10de04 xenwebsite-env]# python
Python 2.7.3 (default,Nov 22 2012,09:29:29) 
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2
Type "help","copyright","credits" or "license" for more information.
>>> from pyxlib.flaskext.decorators import with_db_retry
# 報錯:說明當前環境下找不到這個包
Traceback (most recent call last):
 File "<stdin>",line 1,in <module>
ImportError: No module named pyxlib.flaskext.decorators
# 檢視當前換下所有包的路徑
>>> import sys
>>> sys.path
['','/opt/work/web/xenwebsite/xenwebsite-env/lib64/python27.zip','/opt/work/web/xenwebsite/xenwebsite-env/lib64/python2.7',/opt/work/web/xenwebsite/xenwebsite-env/lib/python2.7/site-packages/httplib2-0.9-py2.7.egg]
#發現沒有我們路徑,為了驗證當前包是不是正確,那麼把這個路徑加入到當前的sys.path 裡面來。
>>> sys.path.append('/opt/work/web/xenwebsite/xenwebsite-env/lib/python2.7/site-packages/pyxlib-1.1.dev_r1349-py2.7.egg')
# 重新引入這個包看看報不報錯
>>> from pyxlib.flaskext.decorators import with_db_retry
# 這次沒有報錯,說明包本身沒有問題,那麼應該就是當前虛擬環境沒有載入這個包,所以當前問題就是怎麼讓虛擬環境來載入這個包:退出python環境
>>> exit()
# 在python裡面,xxx.pth 檔案是儲存包路徑的檔案,於是我們想到,當前的虛擬環境下面的.pth檔案是不是沒有載入這個,於是先查詢這個.pth檔案
(xenwebsite-env)[root@aeb02c10de04 xenwebsite-env]# find / -name *.pth
/opt/work/web/xenwebsite/xenwebsite-env/lib/python2.7/site-packages/easy-install.pth
/opt/work/web/xenwebsite/xenwebsite-env/lib/python2.7/site-packages/setuptools.pth
# 發現2個pth檔案,我們開啟看看發現,我們的第三方包都在 easy_install.pth 檔案裡面,而且發現報錯的那個包並沒有在這個列表裡面:
./setuptools-34.3.3-py2.7.egg
./Flask_Cors-3.0.2-py2.7.egg
# 於是就把報錯的包路徑加入進來
./setuptools-34.3.3-py2.7.egg
./Flask_Cors-3.0.2-py2.7.egg
./pyxlib-1.1.dev_r1349-py2.7.egg
# 重新把pycharm 重啟發現包已經可見了,問題解決了

原因分析:

正常情況下放置在python的site-package 資料夾下的檔案都會被當前的python環境給識別,但是發現一個問題就是虛擬環境下面如果把一個python的安裝包(資料夾)刪除之後,對應的easy_install.pth 檔案就會把這一條記錄給移除掉,即便是後面把它給重新複製回來了,虛擬環境也不會把它載入進來(對於虛擬環境來說,自動移除已經刪除的目錄是沒有問題的,因為這樣總不會出問題,但是自動新增放入的資料夾會有問題,因為放入的資料夾不一定是python檔案),所以如果一個包被刪除之後,要重新把它複製進來就需要手動的去修改 easy_install.pth檔案,把那個資料夾複製進來。

解決流程:

1.驗證當前環境的路徑裡面有沒有我們要使用的包

2.如果有,但是無法使用說明包有問題,刪除重新新增

3.如果沒有,手動的把包路徑append到當前的sys.path裡面

4.引入當前包:如果報錯把資料夾刪除重新匯入,如果不報錯說明包沒有問題

5.解決虛擬環境引用當前包的問題:虛擬環境的 easy_install.pth 路徑下添加當前包的路徑

補充知識:python刪除pipenv安裝virtualenv後虛擬環境中的庫無法正常使用的解決方案 fitz安裝錯誤解決方案

虛擬環境配置

1.程式設計環境配置調整

昨晚,程式設計環境再次出現問題,膝上型電腦上的虛擬環境再次無法正常通過Flask驅動,但是虛擬環境中通過pip3 list依舊可以檢視到已經安裝的庫,但是遺憾的是並沒有辦法啟動這些庫。最後一咬牙,直接刪除了已經安裝的Python,並把之前通過pipenv安裝的庫全部進行了刪除,儘可能的清理掉後,準備全部重新安裝庫。

windows中安裝python庫,可以先更換更新源,在當前使用者目錄下,如我的電腦是 “C:\Users\27496” 下面新增pip.ini 檔案,在檔案中新增一行

“http://mirrors.aliyun.com/pypi/simple/”

就可以更換python安裝各種庫到阿里雲的更新源上,速度非常快。利用以前下載的3.6.6的安裝包,今天在安裝時突然又報錯,無法正常安裝。重新到官網下載,連結地址是:

https://www.python.org/ftp/python/3.6.6/python-3.6.6-amd64.exe

這是可執行的安裝包。可以在安裝時預設安裝pip和新增到PATH路徑,避免人工再次去新增。後來發現官網下載太慢了。就直接在cdsn上面重新下載了一個3.6.6的安裝包,然後重新安裝到D盤,然後又刪除了各個虛擬環境下的venv包(早期喜歡用pipenv,現在發現特坑),然後重新把所需要的安裝包安裝一次,虛擬環境恢復正常,不容易,不容易。

Python fitz庫安裝的兩個坑

fitz使用第一坑

python庫安裝遇到了很多難題,比如安裝fitz庫,直接無法正常安裝,上網查,

traits‑6.0.0‑cp38‑cp38‑win_amd64.whl

必須提前下載安裝這樣一個檔案。先試試。python離線庫下載地址大全,網址:

python各類庫whl檔案的下載地址,可以直接點選

這裡面有所有的離線包可以下載非常全面。到裡面找這個

traits‑6.0.0‑cp38‑cp38‑win_amd64.whl

結果下載安裝時,直接報錯,提示不適用該平臺。我發現cp38,考慮是python3.8適用的,於是重新進去下載3.6版本的。下面是3.6的32和64位系統兩個檔名

traits‑6.0.0‑cp36‑cp36m‑win_amd64.whl

traits‑6.0.0‑cp36‑cp36m‑win32.whl

下載完成後,將檔案放入python安裝資料夾的scripts資料夾中,cmd命令進入該資料夾,pip3 install加安裝檔名直接安裝。再通過安裝fitz,安裝成功。

#依次安裝如下包,第一個必須在檔案所在目錄安裝
pip3 install traits‑6.0.0‑cp36‑cp36m‑win_amd64.whl
pip3 install fitz

fitz使用第二坑

僅僅安裝第一坑中的檔案後,可以直接通過pip安裝fitz,但是,輸入import fitz後,會報錯,提示No module named ‘frontend'

import fitz

很奇怪是吧, 我也很奇怪,明明安裝好了,就是不能載入包,我估計是缺少一個依賴,然後直接百度後,安裝了這個:

pip3 install PyMuPDF

然後import成功。fitz兩個坑,真心花了一小會功夫。

以上這篇解決python 虛擬環境刪除包無法載入的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。