1. 程式人生 > >Python錯誤集錦

Python錯誤集錦

1. centos更新到python2.7時,無法正常使用方向鍵:


此問題原地址(感謝作者的分享):here
圖中的方向鍵全部被轉義了,在互動模式下使用非常不方便。 這個問題主要是由於缺少readline Module問題導致的。而CentOS預設只有readline模組而沒有readline-devel開發模組。所以只要安裝下即可。
#安裝readline-devel $yum -y install readline-devl #重新安裝python $./configure $make install
到此問題應該已經解決了。如果還是不行,可以嘗試使用Python自帶的readline模組。 注:重新安裝python對之前所安裝的外掛無影響
。 2. Win7 64位安裝 theano, ImportError: not import name gof 本文在32位機器上安裝theano時(之前需要安裝cygwin 或者mingw),之後輸入'from theano import *', 可以啟動,沒問題; 可是在筆記本win7 64位安裝theano,使用'from theano import *'時,顯示進行一系列的貌似編譯的工作,之後在使用此命令時匯入theano時,最後提示:“ImportError: not import name gof”。 在網上沒有找到很好的關於gof的解決方案(有英文的,但是回答者也沒說清楚),說是先安裝libpython1.2,等等,重灌了幾次,最後提示“pythonw.exe已停止工作”,實在沒招了,因為急著要用,暫時沒時間解決這個問題,於是按照theano官網上說的使用Anaconda安裝,步驟如下:
下載theano的zip檔案:https://github.com/Theano/Theano ,解壓到E:/Anaconda/Lib/site-packages/theano(檔案裡面有個theano的資料夾,拿出來放在E:/Anaconda/Lib/site-packages裡面)目錄下。 新增環境變數:    path: E:/Anaconda/MinGW/bin;E:/Anaconda/MinGW/x86_64-w64-mingw32/lib;  

                              (32bit  E:/Anaconda/MinGW/i686-w64-mingw32/lib;)   

新建環境變數:  PYTHONPATH: E:/Anaconda/Lib/site-packages/theano;

本人PC機(32位)安裝Anaconda和Theano的步驟:
1. 首先安裝MinGW,預設安裝在C:/MinGW, 配置環境變數:PATH= ...; C:/MinGW/bin
2. 安裝Anaconda-32.exe 從官網上下載, 配置環境變數;參看:Deep Learning Theano安裝配置 3. 手動配置theano, 下載theano.zip檔案,解壓導‘Anaconda安裝目錄/Lib/site-packages/theano’中, 在'C:/users/使用者名稱'目錄下,新建'.theanorc.txt'檔案,輸入以下內容: [global] openmp=False [blas] ldflags= [gcc] cxxflags = -IC:/MinGW/include 之後,在CMD中,測試是否安裝成功:
分別輸入 python, import theano, print theano.config.blas.ldflags
如果沒有出錯,則說明安裝成功 注: win7下已如果安裝cygwin而不是mingw, 進行import theano時,可能多次編譯,並提示'ImportError: not import name gof'錯誤,theano官網上有說明:"Note that it should be possible to run Theano withCygwin instead of MinGW, but this has not been tested yet", 這說明cygwin不能安裝成功,本人之前安裝的是cygwin,不得已換成mingw~ 3. Centos6.4 安裝theano出現的錯誤 在安裝好numpy、scipy、theano後。 
在python程式碼中,敲入:import theano,報錯如下: 
Error程式碼  收藏程式碼
  1. Problem occurred during compilation with the command line below:  
  2. g++ -shared -g -m64 -fPIC -I/usr/local/lib/python2.7/site-packages/numpy/cor  
  3. e/include -I/usr/local/include/python2.7 -o /root/.theano/compiledir_Linux-2  
  4. .6.18-308.el5-x86_64-with-redhat-5.8-Tikanga-x86_64-2.7.3-64/lazylinker_ext/  
  5. lazylinker_ext.so /root/.theano/compiledir_Linux-2.6.18-308.el5-x86_64-with-  
  6. redhat-5.8-Tikanga-x86_64-2.7.3-64/lazylinker_ext/mod.cpp -L/usr/local/lib -  
  7. lpython2.7  
  8. /usr/bin/ld: /usr/local/lib/libpython2.7.a(abstract.o): relocation R_X86_64_  
  9. 32 against `a local symbol' can not be used when making a shared object; rec  
  10. ompile with -fPIC  
  11. /usr/local/lib/libpython2.7.a: could not read symbols: Bad value  
  12. collect2: ld returned 1 exit status  
  13. Traceback (most recent call last):  
  14.   File "<stdin>", line 1, in <module>  
  15.   File "theano/__init__.py", line 55, in <module>  
  16.     from theano.compile import \  
  17.   File "theano/compile/__init__.py", line 5, in <module>  
  18.     from theano.compile.function_module import *  
  19.   File "theano/compile/function_module.py", line 18, in <module>  
  20.     import theano.compile.mode  
  21.   File "theano/compile/mode.py", line 11, in <module>  
  22.     import theano.gof.vm  
  23.   File "theano/gof/vm.py", line 486, in <module>  
  24.     import lazylinker_c  
  25.   File "theano/gof/lazylinker_c.py", line 89, in <module>  
  26.     preargs=args)  
  27.   File "theano/gof/cmodule.py", line 1829, in compile_str  
  28.     (status, compile_stderr.replace(b('\n'), b('. '))))  
  29. Exception: Compilation failed (return status=1): /usr/bin/ld: /usr/local/lib  
  30. /libpython2.7.a(abstract.o): relocation R_X86_64_32 against `a local symbol'  
  31.  can not be used when making a shared object; recompile with -fPIC. /usr/loc  
  32. al/lib/libpython2.7.a: could not read symbols: Bad value. collect2: ld retur  
  33. ned 1 exit status.  


仔細分析錯誤程式碼之後,定位原因在於, 
python在編譯時,libpython2.7.a庫中的abstract.o模組的編譯過程中,沒有加上-fPIC; 

按照網上的方法,各種在python編譯過程中加上-fPIC引數,都沒有解決; 
最後仔細看make命令的輸出結果,發現abstract.o模組根本就沒有經過編譯。 
繼續最終,發現Python的原始碼路徑中Object下,abstract.c和abstract.o都存在,而且這個檔案是下載python包是就已經編譯好了的(生成了.o檔案); 
然後刪除所有.o檔案,然後重新make,在make,就有abstract.o的編譯過程了。 

尼瑪,這個問題整整搞了我10個小時,不知道能不能完全解決。 
------------ 
尼瑪,就知道沒有那麼容易,後來又報另外一個包需要重新編譯。 
然後我把Python原始碼目錄中所有自帶的.o檔案刪了,然後就ok啦。。。 
安裝命令如下: 

Shell程式碼  收藏程式碼
  1. ./configure --prefix=/usr/local/  –enable-shared CFLAGS=-fPIC  
  2. make  
  3. make install  

4. theano安裝方法

安裝theano之前,需要安裝blas, blas-devel, lapack, lapack-devel, atlas, atlas-devel, numpy, scipy

第一步:yum install blas, blas-devel, lapack, lapack-devel, atlas, atlas-devel

第二布:pip install numpy, pip install scipy  # 之前確保已安裝pip

第三步: pip install theano

進入python之後,可能會出現3中的錯誤,按照其解決方案更改; 也有可能出現5處出現的錯誤~

5. import theano後,出現錯誤:"ImportError: libpython2.7.so.1.0: cannot open shared object file: No such file or directory"

錯誤原因:

  由於在系統的lib路徑中找不到這個共享庫。

   注: 如果編譯時加上了--enable-shared,才會編譯這個共享庫,預設的位置是python可執行程式所在目錄的lib目錄下,如/usr/local/python274

重新編譯後,將 libpython2.7.so.1.0 所在檔案目錄(如/usr/local/python274)放在環境變數PATH中: vim /etc/profile ,

6. 32位機器上,MySQLdb 連線mysql出錯: _mysql_exceptions.OperationalError:(2003, ''Can't....(10061)'')


解決辦法,將host='localhoist' 改為 host='127.0.0.1',即可

7. pydev + eclipse + python 中文亂碼問題

解決方案:

Eclipse的設定

window->preferences->general->editors->text editors->spelling->encoding->UTF-8

window->preferences->workspace->text file encoding->UTF-8

開啟eclipse安裝目錄->eclipse.ini,末行加上”-Dfile.encoding=UTF-8”

檔案編碼

py檔案記得儲存成UTF-8,檔案首行加上”#coding=utf-8”

run時設定

run-->run configurations->python run->Common-> Encoding ->UTF-8

注:亂碼部分需要刪去,重寫

8. TypeError: 'str' object is not callable

當一般內部函式被用作變數名後可能出現此錯誤。比如:

range=1

for i in range(0,1):

………

就會報這樣的錯誤

這樣的錯會報在for行,但是時間引起的原因卻是在range=1這行,如果兩行相距較遠,怎很難被發現。所以要特別注意不要用內部已有的變數和函式名作自定義變數名。

解決方案:更改變數名, 不要與內部函式名 重名,如:str, range等

9. ValueError: operands could not be broadcast together with shapes (3000,20) (20,20)

本人出現的問題是,兩個陣列A,B的大小分別為(3000,20) (20,20), 是<numpy.ndarray>型別,而不是<matrix>型別,直接進行乘積C = A*B, 之後,提示上述錯誤,原因是陣列大小“不一致”, 解決方案,不用"*"符號,使用numpy中的dot()函式,可以實現兩個二維陣列的乘積,或者將陣列型別轉化為矩陣型別,使用"*"相乘,具體如下:

A = numpy.array([1,2], [3,4], [5,6])    # 3*2 numpy.ndarray
B = numpy.array([1,2,3], [4,5,6])       # 2*3 numpy.ndarray
C = A * B    # raise error: ValueError: operands could not be broadcast together with shapes (3,2) (2,2)

# solution method 1
C = numpy.dot(A, B)             # C: 3*3 numpy.ndarray

# solution method 2
A_mat = numpy.matrix(A)
B_mat = numpy.matrix(B)

C = A_mat * B_mat           # C: 3*3 numpy.matrixlib.defmatrix.matrix