По-видимому, импорт python ведет себя по-другому в файле mercurial_keyring.py

Причудливая ошибка import мешает мне устанавливать меркурийное расширение.

Я пытаюсь получить расширение mercurial_keyring так что мне не нужно вводить имя пользователя и пароль каждый раз, когда я использую mercurial для проекта.

Я использую Python 2.7.1. Я установил mercurial с двоичным кодом, представленным на https://www.mercurial-scm.org/ .

Я установил keyring и mercurial_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 

И вещи, казалось, двигались.

Однако, когда я пытаюсь выполнить любые команды mercurial, требующие моего пароля, чтобы он был сохранен с помощью keyring ( например, hg pull , hg push ), я получаю ошибку

 abort: No module named keyring! 

Самая запутанная часть заключается в том, что существует четкая

 import keyring 

в строке 28 mercurial_keyring.py которая разрешена без каких-либо проблем. Фактически, любой import keyring успешно выполняет внешние классы и методы и не работает внутри них!

Я просто упомянул, что эта ошибка возникает в get_http_password mercurial_keyring.py в классе PasswordStore в методе get_http_password при попытке выполнить следующее:

 return keyring.get_password(...) 

Есть предположения?

У меня такое ощущение, что я пропустил что-то очевидное, но я потратил много времени, пытаясь понять это, и google пока что не был особенно полезен. Любой вход будет оценен с большой благодарностью.

6 Solutions collect form web for “По-видимому, импорт python ведет себя по-другому в файле mercurial_keyring.py”

Скорее всего, hg выполняется с использованием системы python (2.6), а не с копией 2.7, которую вы установили.

Попробуйте установить mercurial_keyring и keyring под keyring 2.6, и посмотрите, работает ли это так, как ожидается.

Mercurial использует функцию «demandimport», которая откладывает импорт модулей до первого использования. Так что ваши

импорт ключей

не будет терпеть неудачу на этой линии, но он будет плакать только тогда, когда он используется первым (то есть)

return keyring.get_password (…)

Я столкнулся с той же проблемой и разрешил ее, установив расширение с простой установкой: sudo easy_install mercurial_keyring

Это устанавливает его под одним и тем же питоном, который использует mercurial.

import s в методах оценивается при их вызове, тогда как импорт верхнего уровня оценивается немедленно. Поведение импорта может быть изменено, посмотрите на модули imp и сайта, а также sys.path . Что, вероятно, происходит, так это то, что некоторый код в конце файла (образно, также может быть вызовом функции при инициализации или так) изменяет поведение импорта случайно или предотвращает и замечает непреднамеренный поздний import s.

Моя проблема заключалась в том, что я установил Mercurial через macports , но расширение через pip . Чтобы решить эту проблему, мне пришлось установить расширение через macports .

 sudo port install py-keyring py-mercurial_keyring 

Ответ @ ncoghlan прав (для меня, во всяком случае), но неполный, и у меня недостаточно комментариев для комментариев. (Джереми С, я думаю, это отвечает на ваш вопрос.)

Для установки для конкретной версии Python используйте следующие изменения: Вместо

 easy_install keyring 

использование

 easy_install-2.6 keyring 

То же самое относится к любой из команд easy_install или других Python. Я нашел это из примера для pip здесь: Как установить модуль для использования для конкретной версии?

Python - лучший язык программирования в мире.