Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python import seems to behave differently in mercurial_keyring.py file

A bizarre import error is preventing me from installing a mercurial extension.

I'm trying to get the mercurial_keyring extension running so that I don't have to type in my user name and password every time I use mercurial for a project.

I'm using Python 2.7.1. I installed mercurial with the binary provided at https://www.mercurial-scm.org/.

I installed keyring and mercurial_keyring with pip.

I first tried to add the extension by adding this to ~/.hgrc:

[extensions]
...
mercurial_keyring = 

as indicated in the installation instructions here. However, I got the following error:

*** failed to import extension mercurial_keyring: No module named mercurial_keyring

From the same installation instructions, I tried pointing mercurial directly to the mercurial_keyring.py file, which worked.

[extensions]
...
hgext.mercurial_keyring = /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/mercurial_keyring.py

And things seemed to be moving along.

However, when I try to execute any mercurial commands requiring my password so that it will be saved by keyring (e.g. hg pull, hg push) I get the error

abort: No module named keyring!

The most confusing part is that there is a clear

import keyring

in line 28 of mercurial_keyring.py that is resolved without any problems. In fact, any import keyring succeeds outside classes and methods and fails inside them!

Just for the sake of thoroughness, I'll mention that this error arises in the mercurial_keyring.py in the PasswordStore class in the get_http_password method when the following is attempted

return keyring.get_password(...)

Any thoughts?

I have the feeling that I'm missing something obvious, but I've spent a good deal of time trying to figure this out and google has not been particularly helpful so far. Any input will be greatly appreciated.

like image 298
arturomp Avatar asked Mar 02 '11 20:03

arturomp


2 Answers

Most likely, hg is running using the system python (2.6) rather than the copy of 2.7 you have installed.

Try installing mercurial_keyring and keyring under 2.6, and see if that gets things working as expected.

like image 54
ncoghlan Avatar answered Nov 07 '22 15:11

ncoghlan


Mercurial uses a feature called 'demandimport' which postpones the import of modules, until the first time they are used. So, your

import keyring

won't fail at that line, but it will wail only when it's used first(i.e)

return keyring.get_password(...)

like image 35
tamizhgeek Avatar answered Nov 07 '22 15:11

tamizhgeek