奇怪的import
错误阻止我安装mercurial扩展程序。
我正在尝试运行mercurial_keyring
扩展程序,这样每次我对项目使用mercurial时都不必输入我的用户名和密码。
我正在使用Python 2.7.1。我使用https://www.mercurial-scm.org/提供的二进制文件安装了mercurial。
我使用keyring
安装了mercurial_keyring
和pip
。
我首先尝试将此扩展添加到~/.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 pull
,hg 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(...)
有什么想法吗?
我觉得我错过了一些明显的东西,但我花了很多时间试图解决这个问题,到目前为止谷歌并没有特别有用。任何意见都将不胜感激。
答案 0 :(得分:8)
最有可能的是,hg
正在使用系统python(2.6)而不是已安装的2.7的副本运行。
尝试在2.6下安装mercurial_keyring
和keyring
,看看是否可以按预期运行。
答案 1 :(得分:1)
Mercurial使用名为'demandimport'的功能,该功能推迟了模块的导入,直到第一次使用它们为止。那么,你的
导入密钥环
不会在那条线上失败,但只有当它首先使用时才会失败(即)
返回keyring.get_password(...)
答案 2 :(得分:1)
我遇到了同样的问题并通过轻松安装安装扩展程序解决了这个问题: sudo easy_install mercurial_keyring
这将在mercurial使用的同一个python下安装它。
答案 3 :(得分:1)
要安装特定版本的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
在被调用时会被评估,而顶级导入会立即被评估。可以修改导入行为,查看imp和site模块以及sys.path。可能发生的是文件末尾的某些代码(比喻,也可能是初始化时的函数调用等)意外地修改了导入行为,或者防止并注意到无意的迟到import
。
答案 5 :(得分:0)
我的问题是我通过Mercurial
安装了macports
,但通过pip
安装了扩展程序。要解决这个问题,我还必须通过macports
安装扩展程序。
sudo port install py-keyring py-mercurial_keyring