7

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

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

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

我安装keyringmercurial_keyring使用pip.

我首先尝试通过将其添加到以下内容来添加扩展名~/.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

事情似乎在发展。

但是,当我尝试执行任何需要我的密码以便将其保存keyring例如 hg pullhg push)的 mercurial 命令时,我收到错误

abort: No module named keyring!

最令人困惑的部分是有一个明确的

import keyring

在第 28 行mercurial_keyring.py中解决了没有任何问题。事实上,任何import keyring在类和方法之外成功而在它们内部失败!

只是为了彻底起见,我会提到这个错误出现在方法mercurial_keyring.py中的PasswordStore类中get_http_password尝试以下操作时

return keyring.get_password(...)

有什么想法吗?

我感觉我遗漏了一些明显的东西,但我花了很多时间试图弄清楚这一点,而谷歌到目前为止并没有特别有用。任何输入将不胜感激。

4

6 回答 6

9

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

尝试在 2.6 下安装mercurial_keyringkeyring看看是否能按预期工作。

于 2011-03-03T01:24:30.110 回答
1

我遇到了同样的问题,并通过简单安装安装扩展来解决它:sudo easy_install mercurial_keyring

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

于 2013-01-03T11:14:43.250 回答
1

Mercurial 使用了一个名为“demandimport”的特性,它可以推迟模块的导入,直到它们第一次被使用。所以,你的

进口钥匙圈

不会在那条线上失败,但只有在第一次使用时才会哭泣(即)

返回 keyring.get_password(...)

于 2011-03-04T05:15:37.897 回答
1

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

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

easy_install keyring

利用

easy_install-2.6 keyring

这同样适用于任何 easy_install 或其他 Python 命令。我从此处的 pip 示例中找到了这一点:如何安装一个模块,使用 pip for specific version of?

于 2015-09-16T17:18:03.657 回答
0

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

于 2011-03-02T23:00:05.267 回答
0

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

sudo port install py-keyring py-mercurial_keyring
于 2015-07-25T16:51:19.500 回答