python导入在mercurial_keyring.py文件中的行为似乎不同
我遇到了一个奇怪的 import
错误,这让我无法安装一个 mercurial 扩展。
我想让 mercurial_keyring
扩展运行,这样我每次使用 mercurial 做项目时就不用每次都输入用户名和密码了。
我使用的是 Python 2.7.1。我是通过 https://www.mercurial-scm.org/ 提供的安装包安装了 mercurial。
我用 pip
安装了 keyring
和 mercurial_keyring
。
我首先尝试通过在 ~/.hgrc
文件中添加以下内容来添加这个扩展:
[extensions]
...
mercurial_keyring =
这是按照安装说明 这里 的指示来做的。但是,我遇到了以下错误:
*** 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
事情似乎在朝着好的方向发展。
但是,当我尝试执行任何需要我输入密码的 mercurial 命令,以便 keyring
可以保存密码时(比如 hg pull
或 hg push
),我又遇到了错误:
abort: No module named keyring!
最让人困惑的是,在 mercurial_keyring.py
的第 28 行有一个明确的
import keyring
这个问题在类和方法外部的 import keyring
都能成功,但在内部却失败了!
为了全面起见,我提到这个错误是在 mercurial_keyring.py
的 PasswordStore
类中的 get_http_password
方法里出现的,当尝试以下操作时:
return keyring.get_password(...)
有什么想法吗?
我感觉我可能漏掉了什么明显的东西,但我花了不少时间试图弄明白这个问题,而谷歌也没有特别有帮助。任何建议都将非常感激。
7 个回答
我遇到了同样的问题,后来通过简单的安装方式解决了它:
sudo easy_install mercurial_keyring
这个命令会把它安装在和mercurial使用的同一个Python环境下。
Mercurial 有一个叫做“需求导入”(demandimport)的功能,这个功能会把模块的导入推迟到第一次使用的时候。所以,当你写下这行代码:
import keyring
时,它不会立刻出错,而是在你第一次使用它的时候才会出问题,比如:
return keyring.get_password(...)
很可能,hg
是在用系统自带的 Python 版本(2.6)运行,而不是你安装的 2.7 版本。
你可以试着在 2.6 版本下安装 mercurial_keyring
和 keyring
,看看这样是否能让事情按预期工作。