2011-03-02 37 views
4

奇怪的import錯誤阻止我安裝一個mercurial擴展。python import似乎在mercurial_keyring.py文件中的行爲不同

我試圖讓mercurial_keyring擴展運行,這樣我就不必在每次爲項目使用mercurial時輸入我的用戶名和密碼。

我正在使用Python 2.7.1。我使用https://www.mercurial-scm.org/提供的二進制安裝了mercurial。

我安裝了keyringmercurial_keyringpip

我第一次嘗試加入這個添加的擴展~/.hgrc

[extensions] 
... 
mercurial_keyring = 

如安裝說明here表示。但是,我得到了以下錯誤:

*** failed to import extension mercurial_keyring: No module named mercurial_keyring 

從相同的安裝說明,我試着指着善變直接向mercurial_keyring.py文件,它的工作。

[extensions] 
... 
hgext.mercurial_keyring = /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial_keyring.py 

而事情似乎是在移動。

然而,當我嘗試執行需要我的密碼任何含汞的命令,這樣它將被keyringhg pullhg push)保存我得到的錯誤

abort: No module named keyring! 

最令人困惑的是,有一個明確的

import keyring 
的是沒有任何問題解決的 mercurial_keyring.py線28

。實際上,任何import keyring都可以在類和方法之外成功並在內部失敗!

只是爲了完整性考慮,我會提到,這個錯誤在mercurial_keyring.py出現在PasswordStore類的get_http_password方法時,下面是試圖

return keyring.get_password(...) 

有什麼想法?

我有這樣的感覺,我錯過了一些明顯的東西,但我花了很多時間試圖弄清楚這一點,谷歌迄今爲止並沒有特別有用。任何輸入將不勝感激。

+0

運行'python -m site'時會得到什麼輸出? (你需要將它添加到問題中,它不會作爲註釋讀取) – ncoghlan 2011-03-03 01:11:16

+0

我目前的懷疑是你的2.7安裝或系統2.6安裝有問題,例如mercurial正在使用他們,而你的手動測試正在使用其他。 – ncoghlan 2011-03-03 01:20:00

回答

7

最有可能的是,hg正在使用系統python(2。6)而不是您已安裝的2.7的副本。

嘗試在2.6下安裝mercurial_keyringkeyring,看看能否按預期工作。

+0

是的!我曾嘗試過,但沒有奏效。我已經更新了我的問題,以擴大這一點。 – arturomp 2011-03-03 21:21:59

+0

感謝您的澄清。考慮到你在使用'mercurial_keyring'的標準配置指令時得到'ImportError',我傾向於回到我的第一個猜測(即'hg'使用的是系統安裝2.6,而不是你的副本2.7安裝了額外的模塊)。我已經相應地更新了我的答案。 – ncoghlan 2011-03-04 01:51:54

+0

謝謝!你是對的。我認爲問題在於,二進制形式的mercurial網站安裝到系統的Python 2.6中,而不是默認的,在我的情況下是2.7。現在我已經安裝了用於Python 2.7的pid的mercurial,而不是恢復到2.6。然後,我將'/ usr/local/bin/hg'重命名爲'/ usr/local/bin/hg-2.6',並將'/ usr/local/bin/hg'鏈接到'/Library/Frameworks/Python.framework/版本/ 2.7 /斌/ hg'。 – arturomp 2011-03-04 21:47:25

0

import s在方法被調用時被評估,而頂層導入立即被評估。進口行爲可以修改,查看impsite模塊以及sys.path。可能發生的情況是,文件末尾的某些代碼(比喻性地,也可能是初始化時的函數調用等)會偶然修改導入行爲,或者防止並注意到後續無意中的錯誤。

1

Mercurial使用稱爲'demandimport'的功能,該功能推遲導入模塊,直到第一次使用它們。所以,你的

import keyring

不會在該行失敗,但它會嚎啕大哭,只有當它被用來第一(即)

return keyring.get_password(...)

+0

相關知識!謝謝!快速谷歌搜索未能給我一個明確的答案或文件。你有沒有可以分享的可靠來源? – arturomp 2011-03-04 19:04:11

+0

搜索mercurial-devel arhcives和mercurial wiki。那麼我不知道你的實際問題的原因,但只是指出爲什麼導入鑰匙圈沒有失敗。 – tamizhgeek 2011-03-04 21:19:38

1

我遇到了同樣的問題,並通過簡單的安裝擴展解決它安裝: sudo easy_install mercurial_keyring

這安裝在與mercurial使用相同的python下。

0

我的問題是,我通過macports安裝Mercurial,但通過pip擴展。爲了解決這個問題,我不得不通過macports來安裝擴展。

sudo port install py-keyring py-mercurial_keyring 
0

@ ncoghlan的答案是正確的(對我來說,反正),但不完整的,我沒有足夠的代表處點發表評論。 (傑里米·S,我覺得這個回答你的問題。)

要安裝的Python的特定版本,請使用以下修改: 而不是

easy_install keyring 

使用

easy_install-2.6 keyring 

亦如用於任何easy_install或其他Python命令。我從一個點的例子中找到了這個例子:How to install a module use pip for specific version of?