2014-09-05 17 views
0

Je suis assez nouveau pour python. Bien que je comprenne les types de données de base, le flux de contrôle, etc, je me sens toujours un peu difficile à partir de la vue de niveau supérieur.erreur d'importation relative en python et où peut trouver le code source du module python

L'une de ces questions est relative import. J'ai un morceau de code d'un livre essayant d'implémenter la structure de la file d'attente en utilisant python. Quand je cours le code j'ai eu l'erreur de l'importation, "ValueError: Tentative d'importation relative dans le non-paquet".

Voici la ligne de l'importation:

from ..exceptions import Empty 

Je suis maintenant dans mon dossier de projet de travail. Ma question est comment puis-je faire un ajustement à cette ligne pour faire fonctionner l'ensemble du code? Je suppose que ce module "exceptions" est fait par l'auteur pas le module intégré et en quelque sorte l'auteur n'inclut pas le module dans le dossier actuel. Où puis-je trouver le code source du module intégré python pour que je puisse y jeter un coup d'œil?

Mon système est ubuntu

Merci.

+1

Pour votre question annexe "Où puis-je trouver le code source du module intégré Python": Vous pouvez soit [télécharger la source] (https://www.python.org/download/source/) ou [naviguer en ligne ] (http://hg.python.org/cpython/file/default/) (remplacez 'default' par' 2.7' ou '3.3' ou quoi que ce soit si vous voulez une version spécifique). La source C vers les modules binaires est dans 'Modules', la source Python vers les modules pur-Python est dans' Lib', et la source C vers la plupart des types et fonctions internes sont dans 'Objects' ou' Python' (pour ' bltinmodule.c' et 'sysmodule.c'). – abarnert

Répondre

1

Ce sont importations relatives explicites. Cette syntaxe signifie que le fichier où cette ligne de code réside essaye de import le module Empty (je fais une supposition éclairée à ce sujet, ne voyant pas la structure réelle du répertoire, bien qu'il soit inhabituel pour un module d'avoir une lettre capitale - - Généralement réservé aux classes) du sous-dossier exceptions qui réside dans son répertoire parent.

Voir le Module: Packages doc pour plus d'informations, y compris un exemple spécifique de structure de dossiers avec des importations relatives.

Le livre aurait vraiment dû présenter le code dans une structure de répertoire autonome - par exemple, un git repo que vous pourriez cloner - où ces dépendances intra-paquetage vont juste fonctionner. Il est peu probable qu'il soit lié à l'installation de votre système s'il est en stock (bien que l'on puisse certainement définir PYTHONPATH et d'autres méthodes qui pourraient affecter l'environnement).

À quoi ressemble la structure du module?

Je vous recommande également de regarder dans virtualenv afin de bac à sable vos environnements Python. (Bien que pour le code personnalisé, vous pouvez devez également exécuter un serveur local Pypi ou similaire, bien qu'il existe d'autres options - voir le commentaire @ abarnert ci-dessous). Cela ne suffirait pas à lui seul pour résoudre ce problème particulier, mais c'est une bonne idée en général de garder les projets et leurs différents besoins isolés.

+0

Vous n'avez pas vraiment besoin d'exécuter un serveur PyPI personnalisé; pour installer un 'foo' personnalisé, vous pouvez juste cd dans le répertoire' foo' et 'installer pip --upgrade.' au lieu de 'pip install --upgrade foo'. – abarnert

+0

Ah. Je pensais plutôt au mode opérationnel où vous exécutez un serveur Pypi local et ajoutez '--extra-index ' à l'invocation 'pip' et incluez le module personnalisé dans le fichier * requirements *. Mais c'est intéressant que ce soit aussi une option. – khampson

+0

Oui, c'est certainement une solution plus flexible et puissante, mais la solution rapide et sale est parfois utile - et peut être beaucoup plus facile pour quelqu'un qui commence à peine. (Peut-être que je m'inquiète un peu d'écarter les novices de 'virtualenv', mais c'est toujours triste quand quelqu'un qui aurait dû l'utiliser ne l'a pas fait parce qu'ils pensaient que ça semblait trop compliqué ...) – abarnert