python导入在mercurial_keyring.py文件中的行为似乎有所不同

python导入在mercurial_keyring.py文件中的行为似乎有所不同,python,mercurial,import,abort,Python,Mercurial,Import,Abort,一个奇怪的import错误阻止我安装mercurial扩展 我正在尝试运行mercurial\u keyring扩展,这样我就不必在每次使用mercurial进行项目时都输入用户名和密码 我正在使用Python 2.7.1。我使用提供的二进制文件安装了mercurial 我用pip安装了keyring和mercurial\u keyring 我首先尝试添加扩展,将其添加到~/.hgrc: [extensions] ... mercurial_keyring = 如安装说明所示。但是,我得到了

一个奇怪的
import
错误阻止我安装mercurial扩展

我正在尝试运行
mercurial\u keyring
扩展,这样我就不必在每次使用mercurial进行项目时都输入用户名和密码

我正在使用Python 2.7.1。我使用提供的二进制文件安装了mercurial

我用
pip
安装了
keyring
mercurial\u keyring

我首先尝试添加扩展,将其添加到
~/.hgrc

[extensions]
...
mercurial_keyring = 
如安装说明所示。但是,我得到了以下错误:

*** failed to import extension mercurial_keyring: No module named mercurial_keyring
根据相同的安装说明,我尝试将mercurial直接指向
mercurial_keyring.py
文件,该文件有效

[extensions]
...
hgext.mercurial_keyring = /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial_keyring.py
事情似乎在向前发展

但是,当我试图执行任何需要密码的mercurial命令,以便通过
钥匙圈
(例如
hg pull
hg push
)保存密码时,我得到了错误

abort: No module named keyring!
最令人困惑的是,有一个明确的定义

import keyring
mercurial_keyring.py
的第28行中,该问题已解决,没有任何问题。事实上,任何
导入keyring
都在类和方法之外成功,但在类和方法内部失败

为了彻底起见,我要提到,当尝试以下操作时,
get\u http\u password
方法中的
PasswordStore
类中的
mercurial\u keyring.py
会出现此错误

return keyring.get_password(...)
有什么想法吗


我有一种感觉,我错过了一些显而易见的东西,但我花了很多时间试图弄清楚这一点,而谷歌迄今为止并没有提供特别的帮助。任何输入都将不胜感激。

import
s在调用方法时对其进行评估,而顶级导入将立即进行评估。可以修改导入的行为,查看和模块以及。可能发生的情况是,文件末尾的一些代码(形象地说,也可能是初始化时的函数调用等)意外地修改了导入行为,或者是为了防止和注意到无意中的延迟
import
s。

最有可能的是,
hg
正在使用系统python(2.6)运行而不是您安装的2.7的副本


试着在2.6下安装
mercurial\u keyring
keyring
,看看是否能按预期工作。

mercurial使用了一种称为“demandimport”的功能,该功能将模块的导入推迟到第一次使用时。那么,你的

导入钥匙圈

在那一行不会失败,但只有在第一次使用它时它才会哭(即)

返回keyring.get_密码(…)


我遇到了相同的问题,并通过使用easy install安装扩展解决了此问题: sudo简易安装mercurial钥匙圈


这将在mercurial使用的相同python下安装它。

我的问题是我通过
macports
安装了
mercurial
,但扩展是通过
pip
安装的。为了解决这个问题,我还必须通过
macports
安装扩展

sudo port install py-keyring py-mercurial_keyring

@ncoghlan的回答是正确的(无论如何,对我来说),但不完整,我没有足够的代表点来评论。(杰里米S,我想这回答了你的问题。)

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

easy_install keyring
使用


这同样适用于任何easy_install或其他Python命令。我在这里的一个pip示例中发现了这一点:

运行
python-msite
时会得到什么输出?(您需要将其添加到问题中,作为评论无法阅读)我目前怀疑您的2.7安装或system 2.6安装存在问题,例如mercurial正在使用其中一个,而您的手动测试正在使用另一个。是的!我试过了,但没用。我已经更新了我的问题来扩展这一点。谢谢你的澄清。考虑到使用
mercurial_keyring
的标准配置说明时得到的
importorror
,我倾向于回到我的第一个猜测(即
hg
使用的是2.6的系统安装,而不是安装额外模块的2.7的副本)。我已经相应地更新了我的答案。谢谢!你说得对。我认为问题在于mercurial网站将二进制格式安装到系统的Python2.6中,而不是默认的Python2.7。我现在安装了mercurial for python 2.7和pip,而不是恢复到2.6。然后我将
/usr/local/bin/hg
重命名为
/usr/local/bin/hg-2.6
,并将
/usr/local/bin/hg
符号链接为
/Library/Frameworks/Python.framework/Versions/2.7/bin/hg
尝试在2.6下安装mercurial\u钥匙环和钥匙环,看看是否能按预期工作。
。。。你是怎么做到的?很高兴知道!谢谢谷歌的快速搜索并没有给我一个明确的答案或关于这个问题的文档。你有什么可以分享的可靠资源吗?在mercurial devel arhcives和mercurial wiki中搜索。我不知道您实际问题的原因,但我只是指出了导入keyring没有失败的原因。
easy_install-2.6 keyring