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

7 投票
7 回答
7502 浏览
提问于 2025-04-16 12:51

我遇到了一个奇怪的 import 错误,这让我无法安装一个 mercurial 扩展。

我想让 mercurial_keyring 扩展运行,这样我每次使用 mercurial 做项目时就不用每次都输入用户名和密码了。

我使用的是 Python 2.7.1。我是通过 https://www.mercurial-scm.org/ 提供的安装包安装了 mercurial。

我用 pip 安装了 keyringmercurial_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 pullhg push),我又遇到了错误:

abort: No module named keyring!

最让人困惑的是,在 mercurial_keyring.py 的第 28 行有一个明确的

import keyring

这个问题在类和方法外部的 import keyring 都能成功,但在内部却失败了!

为了全面起见,我提到这个错误是在 mercurial_keyring.pyPasswordStore 类中的 get_http_password 方法里出现的,当尝试以下操作时:

return keyring.get_password(...)

有什么想法吗?

我感觉我可能漏掉了什么明显的东西,但我花了不少时间试图弄明白这个问题,而谷歌也没有特别有帮助。任何建议都将非常感激。

7 个回答

1

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

这个命令会把它安装在和mercurial使用的同一个Python环境下。

1

Mercurial 有一个叫做“需求导入”(demandimport)的功能,这个功能会把模块的导入推迟到第一次使用的时候。所以,当你写下这行代码:

import keyring

时,它不会立刻出错,而是在你第一次使用它的时候才会出问题,比如:

return keyring.get_password(...)

9

很可能,hg 是在用系统自带的 Python 版本(2.6)运行,而不是你安装的 2.7 版本。

你可以试着在 2.6 版本下安装 mercurial_keyringkeyring,看看这样是否能让事情按预期工作。

撰写回答