Importer le module à partir du sous-dossier

Je veux importer des sous-dossiers en tant que modules. Par conséquent, chaque sous-dossier contient un __init__.py. Ma structure de dossier est comme ceci:

src
  main.py
  dirFoo
    __init__.py
    foofactory.py
    dirFoo1
      __init__.py
      foo1.py
    dirFoo2
      __init__.py
      foo2.py

Dans mon script principal, j'importe

from dirFoo.foofactory import FooFactory

Dans ce fichier d'usine, j'inclus les sous-modules:

from dirFoo1.foo1 import Foo1
from dirFoo2.foo2 import Foo2

Si j'appelle mon foofactory, j'obtiens l'erreur, que python ne peut pas importer les sous-modules foo1 et foo2:

Traceback (most recent call last):
  File "/Users/tmp/src/main.py", line 1, in <module>
from dirFoo.foofactory import FooFactory
  File "/Users/tmp/src/dirFoo/foofactory.py", line 1, in    <module>
from dirFoo1.foo1 import Foo1
    ImportError: No module named dirFoo1.foo1
68
demandé sur Razer 2012-01-21 18:44:22

4 réponses

Il n'y a pas besoin de jouer avec votre PYTHONPATH ou sys.path ici.

Pour utiliser correctement les importations absolues dans un paquet, vous devez également inclure le nom de paquet "root", par exemple:

from dirFoo.dirFoo1.foo1 import Foo1
from dirFoo.dirFoo2.foo2 import Foo2

, Ou vous pouvez utiliser relatif des importations:

from .dirfoo1.foo1 import Foo1
from .dirfoo1.foo1 import Foo2
93
répondu Rob Wouters 2012-01-21 16:18:01

Juste pour notifier ici. (à partir d'un newbee, keviv22)

Jamais et jamais pour votre propre bien, nommez les dossiers ou les fichiers avec des espaces ou des symboles comme " - "ou"_". Si vous l'avez fait, vous pouvez faire face à quelques problèmes. comme le mien, disons, bien que votre commande d'importation soit correcte, vous ne pourrez pas importer avec succès les fichiers souhaités qui sont disponibles dans ces dossiers nommés.

Noms de dossier non valides comme suit:

  • Générique-Classes-Dossier
  • Generic_Classes_Folder

Noms de dossier valides pour CI-DESSUS:

  • GenericClassesFolder ou Genericclassesfolder ou genericClassesFolder (ou comme ceci sans espaces ou symboles spéciaux parmi les mots)

Quelle erreur j'ai fait:

Considérez la structure du fichier.

Parent
   . __init__.py
   . Setup
     .. __init__.py
     .. Generic-Class-Folder
        ... __init__.py
        ... targetClass.py
   . Check
     .. __init__.py
     .. testFile.py

Ce que je voulais faire?

  • depuis testFile.py, je voulais importer le 'targetClass.py' fichier à l'intérieur le fichier generic-Class-Folder à utiliser la fonction nommée "functionExecute" dans 'targetClass.py' fichier

Quel ordre j'ai fait?

  • depuis 'testFile.py', commande écrite, de Base.Générique-Classe-Dossier.targetClass importation functionExecute
  • Vous avez des erreurs comme "SyntaxError: syntaxe invalide"

Essayé de nombreuses recherches et vu de nombreuses questions stackoverflow et incapable de décider ce qui a mal tourné. Je croix vérifié mes fichiers plusieurs fois, j'ai utilisé __init__.py fichier, chemin d'environnement inséré et extrêmement inquiet de ce qui a mal tourné......

Et après un long long long temps, j'ai compris cela en parlant avec un de mes amis. Je suis un peu stupide d'utiliser de telles conventions de nommage. Je ne devrais jamais utiliser d'espace ou de symboles spéciaux pour définir un nom pour un dossier ou un fichier. Donc, c'est ce que je voulais transmettre. Une bonne journée!

(désolé pour le poste énorme sur ce... je laisse tomber mes frustrations.... :) Merci!)

14
répondu Vivek22 2017-01-27 12:10:08

Définissez votre variable D'environnement PYTHONPATH. Par exemple, comme ceci PYTHONPATH=.:.. (pour la famille * nix).

Vous pouvez également ajouter manuellement votre répertoire actuel (src dans votre cas) à pythonpath:

import os
import sys
sys.path.insert(0, os.getcwd())
3
répondu Maxim Kamenkov 2012-01-21 16:06:42

Dites que votre projet est structuré de cette façon:

+---MyPythonProject
|   +---.gitignore
|   +---run.py
|   |   +---subscripts
|   |   |   +---script_one.py
|   |   |   +---script_two.py

Dans run.py, vous pouvez importer des scripts un et deux par:

from subscripts import script_one as One
from subscripts import script_two as Two

Maintenant, toujours à l'intérieur de run.py, vous pourrez appeler leurs méthodes avec:

One.method_from_one(param)
Two.method_from_two(other_param)
0
répondu Flavio Wuensche 2018-09-25 20:34:20