импорт python в файле mercurial_keyring.py работает иначе - PullRequest
5 голосов
/ 02 марта 2011

Странная ошибка import мешает мне установить расширение Mercurial.

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

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

Я установил keyring и mercurial_keyring с pip.

IСначала попытался добавить расширение, добавив его в ~/.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 pull, hg push) Я получаю сообщение об ошибке

abort: No module named keyring!

Самая запутанная часть заключается в том, что в строке 28 из mercurial_keyring.py есть четкие

import keyring

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

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

return keyring.get_password(...)

Есть мысли?

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

Ответы [ 6 ]

8 голосов
/ 03 марта 2011

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

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

1 голос
/ 16 сентября 2015

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

Чтобы установить для конкретной версии Python, используйте следующие модификации: Вместо

easy_install keyring
1005 * * Используйте
easy_install-2.6 keyring

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

1 голос
/ 03 января 2013

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

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

1 голос
/ 04 марта 2011

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

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

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

return keyring.get_password (...)

0 голосов
/ 25 июля 2015

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

sudo port install py-keyring py-mercurial_keyring
0 голосов
/ 03 марта 2011

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

...