python导入似乎在mercurial_keyring.py文件中表现不同

时间:2011-03-02 20:43:57

标签: python mercurial import abort

奇怪的import错误阻止我安装mercurial扩展程序。

我正在尝试运行mercurial_keyring扩展程序,这样每次我对项目使用mercurial时都不必输入我的用户名和密码。

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

我使用keyring安装了mercurial_keyringpip

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

[extensions]
...
mercurial_keyring = 

如安装说明here中所示。但是,我收到以下错误:

*** 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命令时,keyring例如 hg 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(...)

有什么想法吗?

我觉得我错过了一些明显的东西,但我花了很多时间试图解决这个问题,到目前为止谷歌并没有特别有用。任何意见都将不胜感激。

6 个答案:

答案 0 :(得分:8)

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

尝试在2.6下安装mercurial_keyringkeyring,看看是否可以按预期运行。

答案 1 :(得分:1)

Mercurial使用名为'demandimport'的功能,该功能推迟了模块的导入,直到第一次使用它们为止。那么,你的

  

导入密钥环

不会在那条线上失败,但只有当它首先使用时才会失败(即)

  

返回keyring.get_password(...)

答案 2 :(得分:1)

我遇到了同样的问题并通过轻松安装安装扩展程序解决了这个问题: sudo easy_install mercurial_keyring

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

答案 3 :(得分:1)

@ ncoghlan的答案是对的(对我来说,无论如何),但不完整,我没有足够的代表评论。 (Jeremy S,我认为这可以回答你的问题。)

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

easy_install keyring

使用

easy_install-2.6 keyring

同样适用于任何easy_install或其他Python命令。我从这里的pip示例中找到了这个:How to install a module use pip for specific version of?

答案 4 :(得分:0)

方法中的

import在被调用时会被评估,而顶级导入会立即被评估。可以修改导入行为,查看impsite模块以及sys.path。可能发生的是文件末尾的某些代码(比喻,也可能是初始化时的函数调用等)意外地修改了导入行为,或者防止并注意到无意的迟到import

答案 5 :(得分:0)

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

sudo port install py-keyring py-mercurial_keyring