2010-07-27 3 views
3

J'ai des problèmes avec mon PythonPath sous Windows XP, et je me demande si je fais quelque chose de mal.PYTHONPATH enfer avec des structures de paquets qui se chevauchent

Dites que j'ai un projet (créé avec Pydev) qui a un répertoire src. Sous src J'ai un seul paquet, nommé common, et dans un seul module de classe, nommé service.py avec un nom de classe Service

Dites maintenant que j'ai un autre projet (également créé avec Pydev) avec un répertoire src et une commune paquet. Dans le package commun, j'ai un seul script, client.py, qui importe le service. Donc, en d'autres termes, deux emplacements de disque distincts, mais le même paquet.

J'ai remarqué que même si je définissais mon PYTHONPATH pour inclure les deux répertoires src, l'importation échoue sauf si les fichiers se trouvent tous les deux dans le même répertoire. Je reçois le redouté aucun module trouvé. Ai-je mal compris comment python résout les noms de modules? Je suis habitué à Java et à son enfer de classe.

Répondre

1

Je pense qu'en Python, il vaut mieux éviter ce problème en fournissant un nom unique à chaque paquet. Ne nommez pas les deux packages common. Ensuite, vous pouvez importer à la fois avec quelque chose comme

import common1.service as cs 
import common2.client as cc 
1

Si vous essayez d'importer comme ceci:

import src.common.service 

Python se penchera sur le chemin Python pour un répertoire nommé « src » (ou un œuf, etc.). Une fois qu'il trouve "src", il n'en considèrera pas un autre. Si le premier "src" n'a pas de commun et de service à l'intérieur, alors vous obtiendrez une ImportError, même si un autre répertoire "src" dans le chemin a ces choses.

+0

C'est un comportement particulier, je dois dire. En Java, le classpath est considéré comme la disjonction de tous les répertoires qui seraient explorés. – Uri

2

Si vous devez vraiment avoir un paquet fractionné comme celui-ci, lisez l'attribut de niveau de module __path__. En bref, faites de l'un des répertoires 'src' le principal, et donnez-lui un __init__.py qui ajoute le chemin de l'autre 'src' à la liste __path__. Python va maintenant regarder dans les deux endroits en regardant les sous-modules de 'src'.

Je ne recommande vraiment pas cela pour le long terme. C'est plutôt fragile et ça casse si vous déplacez les choses.

Questions connexes