2010-07-02 4 views
2

Considérons que j'ai un répertoire appelé root qui a deux répertoires: x et y. J'ai un fichier de module qui réside dans x, appelons cela test.py. Maintenant en y, j'ai un module qui doit appeler test.pyImporter des fichiers résidant dans un chemin non apparenté

Je suis en train de faire un simple:

from x import test

Et il fonctionne. Je me demandais, comment cela fonctionne?

EDIT: Comment cela fonctionne, car il n'y avait pas de __init__.py fichier dans , mais encore de y j'ai pu appeler un module à partir de là.

+0

EDIT: J'ai compris cela, puisque mon script original commençait à partir de 'x', c'est pourquoi cela a fonctionné. – user225312

Répondre

1

Ce n'est pas le cas. Vous, ou votre système d'exploitation, ou vos scripts de démarrage de site Python, avez modifié PYTHONPATH.

14:59 [email protected] pwd 
/Users/jsmith/Test/Test2/root 

14:59 [email protected] cat x/test.py 
def hello(): 
    print "hello" 

14:59 [email protected] cat y/real.py 
#!/usr/bin/python 
from x import test 
test.hello() 

14:59 [email protected] y/real.py 
Traceback (most recent call last): 
    File "y/real.py", line 3, in <module> 
    from x import test 
ImportError: No module named x 
+0

Je vois. Quel serait le meilleur moyen d'importer le module, comme dans le cas mentionné plus haut? Je vais vérifier mon code plus tard, mais d'abord je devrais connaître la méthode pour le faire :) – user225312

+0

'import sys', puis' sys.path.append ("/ full/path/to/root") ', et faire Bien sûr, il y a un '__init __. py' dans' root/x'. –

+0

Merci, je vais essayer. Merci pour l'explication et votre temps! – user225312

0

Parce qu'il y a un chemin à parcourir. Essayez ceci:

import sys 
print sys.path 

Cela devrait afficher tout le python endroits utilise comme direcctory de départ pour résoudre les emplacements de module. Ainsi, par exemple, si root est en fait dans/home/PulpFiction/root (ou C: \ Documents and Settings \ PulpFiction \ Mes documents \ racine sur Windows), vous verrez quelque chose comme ceci:

['', '/usr/local/lib/python2.6/dist-packages', *more stuff*, '/home/PulpFiction/root'] 

ou sur les fenêtres:

['', 'C:\\python26\\site-packages', *more stuff here*, 'C:\Documents and Settings\PulpFiction\My Documents\root'] 

Il y a quelques façons sys.path peuvent être définies (que je sache):

  1. le répertoire que vous exécutez le script à partir
  2. variable d'environnement (PYTHONPATH pour être exact)
  3. Registre Windows (sous Windows uniquement évidemment)
  4. manuellement un chemin annexant à la variable sys.path vous-même dans le code

Je devine que la raison pour laquelle il travailler pour vous est que vous avez un script dans root (disons main.py), et ce script finissent par importer à partir de x et y. Puisque vous exécutez le script dans le répertoire racine, il est ajouté au chemin python, ce qui permet à from x import test de fonctionner.

EDIT

Il n'y a pas __init__.py hein? Vous êtes sûr qu'il n'y a pas de __init__.pyc là (notez le C en pyc)?

+0

Je l'essaie, merci pour votre réponse. – user225312

+0

Yup, assez sûr. Je le regarde en ce moment! – user225312

Questions connexes