【问题标题】:python import seems to behave differently in mercurial_keyring.py filepython 导入似乎在 mercurial_keyring.py 文件中表现不同
【发布时间】:2011-07-07 14:08:33
【问题描述】:

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

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

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

我用pip 安装了keyringmercurial_keyring

我首先尝试通过将其添加到 ~/.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 在类和方法之外成功,在它们内部失败!

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

return keyring.get_password(...)

有什么想法吗?

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

【问题讨论】:

  • 运行python -m site时得到什么输出? (您需要将其添加到问题中,它无法作为评论阅读)
  • 我目前的怀疑是您的 2.7 安装或系统 2.6 安装有问题,因此 mercurial 正在使用其中一个,而您的手动测试正在使用另一个。

标签: python mercurial import abort


【解决方案1】:

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

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

【讨论】:

  • 是的!我试过了,但没有用。我已经更新了我的问题以扩展这一点。
  • 感谢您的澄清。鉴于您在使用mercurial_keyring 的标准配置说明时得到的ImportError,我倾向于回到我的第一个猜测(即hg 使用的是2.6 的系统安装,而不是您使用的2.7 副本安装了额外的模块)。我已经相应地更新了我的答案。
  • 谢谢!你说得对。我认为问题在于 mercurial 网站的二进制形式安装到系统的 Python 2.6,而不是默认的,在我的例子中是 2.7。我现在没有恢复到 2.6,而是使用 pip 为 python 2.7 安装了 mercurial。然后我将/usr/local/bin/hg 重命名为/usr/local/bin/hg-2.6 并将/usr/local/bin/hg 符号链接为/Library/Frameworks/Python.framework/Versions/2.7/bin/hg
  • Try installing mercurial_keyring and keyring under 2.6, and see if that gets things working as expected. ... 你是怎么做到的?
【解决方案2】:

Mercurial 使用一个称为“需求导入”的功能,它可以推迟模块的导入,直到它们第一次被使用。所以,你的

导入钥匙圈

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

return keyring.get_password(...)

【讨论】:

  • 很高兴知道!谢谢!快速的谷歌搜索未能给我一个明确的答案或文档。你有任何可靠的来源可以分享吗?
  • 在 mercurial-devel arhcives 和 mercurial wiki 中搜索。好吧,我不知道您的实际问题的原因,但只是指出导入密钥环没有失败的原因。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    @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?

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        sudo port install py-keyring py-mercurial_keyring
        

        【讨论】:

          猜你喜欢
          • 2015-10-10
          • 1970-01-01
          • 1970-01-01
          • 2013-05-13
          • 2018-01-24
          • 1970-01-01
          • 2014-03-26
          • 2022-10-24
          相关资源
          最近更新 更多