2013-10-16 73 views
2

我有一段用Python編寫的代碼,我使用passlib.hash,sha256_crypt對密碼進行散列,然後使用相同的庫驗證密碼。passlib.hash導入sha256_crypt在使用py2exe編譯時給出錯誤

我能夠使用控制檯運行代碼,即使用.py

當我編譯使用py2exe這個程序中出現我的問題:

ImportError: No module named passlib.hash 

我使用下面的命令導入模塊:

from passlib.hash import sha256_crypt 

,有時我看到一個警告說不在一個名爲sha256_crypt模塊GUI但程序仍然正常運行。

我正在使用Windows 7並找不到解決此問題的任何解決方案。我檢查了我的python主目錄,看起來安裝passlib-1.6.1,passlib-1.6.1-py2.7.egg文件是在C:\Python2.7.5\Lib\site-packages下創建的,但是沒有名爲passlib/hashsha_256的文件。

回答

1

爲了只加載已明確要求hashers,Passlib扮演一個動態導入招:passlib.hash實際上是一種特殊的對象,只有當要求導入每個散列器類...真正的散列器類實際上是存儲在passlib的內部包passlib.handlers(特別是,passlib.hash:sha256_crypt實際上存儲在passlib.handlers.sha2_crypt:sha256_crypt下)的模塊。

Py2exe另一方面嘗試變得聰明,並試圖走你的應用程序的導入樹,只捆綁實際加載的模塊。我發現它經常(並且可以理解)在它運行到一個拉動態進口技巧的python包(比如上面)時會被玷污。這最終會導致py2exe打包的應用程序出現奇怪並且很難追蹤導入錯誤的情況。

我不積極,這將解決您的問題,但我知道的最簡單的解決方案是告訴py2exe包含整個passlib包,而不要試圖「猜測」應包含哪些部分。這可以通過添加"passlib"需做py2exe的packages選項...

setup(
    # ... other stuff ... 
    options={ 
      "py2exe":{ 
        # ... other stuff ... 
        "packages": ["passlib"], 
      } 
    } 
) 
+0

我試過這樣做,但現在py2exe失敗,因爲它不能導入passlib。 – uri

2

Eli Collins實際上是正確的,並指出我在正確的方向。

您可以通過更具體地輸入導入來解決您的問題。 我通過改變進口解決我sha512問題要這樣看

from passlib.handlers.sha2_crypt import sha512_crypt 

py2exe分佈現在工作得很好。

我知道這對你有點遲,但它仍然可以幫助某人,就像它幫助了我。榮幸向Eli提出了這個問題並且也很榮幸!

+0

我面臨與OP相同的問題,並以與您相同的方式進行修復。但我仍然想知道爲什麼從passlib.hash import sha256_crypt 的聲明 沒有工作。 – Vikas