7 votes

L'importation python semble se comporter différemment dans le fichier mercurial_keyring.py

Une bizarrerie import m'empêche d'installer une extension mercuriale.

J'essaie d'obtenir le mercurial_keyring afin que je n'aie pas à saisir mon nom d'utilisateur et mon mot de passe à chaque fois que j'utilise mercurial pour un projet.

J'utilise Python 2.7.1. J'ai installé mercurial avec le binaire fourni à l'adresse suivante https://www.mercurial-scm.org/ .

J'ai installé keyring y mercurial_keyring con pip .

J'ai d'abord essayé d'ajouter l'extension en ajoutant ceci à ~/.hgrc :

[extensions]
...
mercurial_keyring = 

comme indiqué dans les instructions d'installation aquí . Cependant, j'ai obtenu l'erreur suivante :

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

À partir des mêmes instructions d'installation, j'ai essayé de faire pointer mercurial directement sur le fichier mercurial_keyring.py ce qui a fonctionné.

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

Et les choses semblaient aller de l'avant.

Cependant, lorsque j'essaie d'exécuter une commande mercuriale nécessitant mon mot de passe afin qu'il soit sauvegardé par keyring ( par exemple hg pull , hg push ), j'obtiens l'erreur suivante

abort: No module named keyring!

Le plus déroutant, c'est qu'il existe une

import keyring

à la ligne 28 de mercurial_keyring.py qui est résolu sans problème. En fait, tout import keyring réussit en dehors des classes et des méthodes et échoue à l'intérieur de celles-ci !

Par souci d'exhaustivité, je précise que cette erreur se produit dans le cadre de la mercurial_keyring.py dans le PasswordStore dans la classe get_http_password lorsque l'on tente d'obtenir ce qui suit

return keyring.get_password(...)

Qu'en pensez-vous ?

J'ai l'impression de passer à côté de quelque chose d'évident, mais j'ai passé beaucoup de temps à essayer de comprendre et Google n'a pas été d'une grande aide jusqu'à présent. Toute contribution sera grandement appréciée.

9voto

ncoghlan Points 10779

Très probablement, hg utilise le système python (2.6) plutôt que la copie de 2.7 que vous avez installée.

Essayez d'installer mercurial_keyring y keyring sous la version 2.6, et voir si les choses fonctionnent comme prévu.

1voto

tamizhgeek Points 774

Mercurial utilise une fonctionnalité appelée "demandimport" qui reporte l'importation des modules jusqu'à leur première utilisation. Ainsi, votre

Importation d'un porte-clés

n'échouera pas à cette ligne, mais il se plaindra seulement lorsqu'il est utilisé en premier (c.-à-d.)

return keyring.get_password(...)

1voto

Priit Points 165

J'ai rencontré le même problème et je l'ai résolu en installant l'extension avec easy install : sudo easy_install mercurial_keyring

Cela l'installe sous le même python que celui utilisé par mercurial.

1voto

Mike Points 61

La réponse de @ncoghlan est juste (pour moi, en tout cas), mais incomplète et je n'ai pas assez de points de rep pour la commenter. (Jeremy S, je pense que cela répond à votre question).

Pour installer une version spécifique de Python, utilisez les modifications suivantes : Au lieu de

easy_install keyring

Utilisation

easy_install-2.6 keyring

Il en va de même pour toute commande easy_install ou autre commande Python. J'ai trouvé ceci dans un exemple pour pip ici : Comment installer un module en utilisant pip pour une version spécifique de ?

0voto

phihag Points 89765

import dans les méthodes sont évaluées lorsqu'elles sont appelées, alors que les importations de premier niveau sont évaluées immédiatement. Le comportement des importations peut être modifié, jetez un coup d'œil à la section diablotin y site ainsi que les modules sys.path . Ce qui se passe probablement, c'est qu'un code à la fin du fichier (au sens figuré, il peut aussi s'agir d'un appel de fonction lors de l'initialisation) modifie le comportement de l'importation par accident ou pour prévenir et remarquer les retards involontaires. import s.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X