2012-03-16 8 views
2

Je tente d'importer un fichier python (appelé test.py qui réside dans le répertoire parent) à partir du fichier python en cours d'exécution (je l'appelle a.py). Tous mes répertoires impliqués ont un fichier qu'il a appelé init.py (avec 2 souligne chaque côté de init)Importer un fichier Python depuis l'intérieur du script d'exécution

Mon problème: Lorsque je tente d'importer le fichier désiré, je reçois l'erreur suivante

tentative d'importation relative non-paquet

Mon code à l'intérieur a.py:

try: 
    from .linkIO can_follow # error occurs here 
except Exception,e: 
    print e 
print success 

note: I sachez que si je devais créer un fichier appelé b.py et importer un fichier a.py (qui en lui-même importe le fichier python désiré) tout fonctionne, alors qu'est-ce qui ne va pas?

Pour exemple:

b.py:

import a 
print "success 2" 
+0

dup possible, http://stackoverflow.com/questions/5497951/attempted-relative-import-in-non-package – Doboy

Répondre

3

Comme indiqué dans PEP 328 toute importation doit être absolue pour empêcher les modules de masquage l'autre. Absolue signifie que le module/package doit se trouver dans le chemin de module sys.path. Les importations relatives (c'est-à-dire le point pour) ne sont autorisées que dans l'intra-paquetage, ce qui signifie que les modules du même paquet veulent s'importer mutuellement.

Alors cela vous laisse avec des possibilités suivantes:

  1. Vous faites un paquet (que vous semblez avoir fait déjà) et ajouter le paquet-chemin vers sys. chemin

  2. que vous venez de régler sys.path pour chaque module

  3. vous mettez tous vos modules personnalisés dans le même répertoire que le démarrage script/application principale

pour 1. et 2. vous pouvez ajouter un paquet/module sys.path comme ceci:

import sys 
from os.path import dirname, join 
sys.path.append(dirname(__file__)) #package-root-directory 

ou

module_dir = 'mymodules' 
sys.path.append(join(dirname(__file__), module_dir)) # in the main-file 

BTW:

from .linkIO can_follow 

peut ne pas fonctionner! L'instruction import est manquante!

Pour rappel: si vous utilisez des importations relatives, vous DEVEZ utiliser la version from: from .relmodule import xyz. Un import .XYZ sans le from n'est pas autorisé!

Questions connexes