web-dev-qa-db-fra.com

Module d'importation depuis un 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 suivante: 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
85
Razer

Il n'est pas nécessaire de jouer avec votre PYTHONPATH ou sys.path ici.

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

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

Ou vous pouvez utiliser importations relatives :

from .dirfoo1.foo1 import Foo1
from .dirfoo1.foo1 import Foo2
113
Rob Wouters

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

Jamais et pour votre bien personnel, nommez les dossiers ou les fichiers avec des espaces ou des symboles tels que "-" ou "_". Si vous le faites, vous risquez de rencontrer quelques problèmes. Comme le mien, par exemple. votre commande d'importation est correcte, vous ne pourrez pas importer avec succès les fichiers souhaités disponibles dans les dossiers nommés.

Noms de dossiers incorrects comme suit:

  • Dossier générique
  • Generic_Classes_Folder

noms de dossiers valides pour ce qui précède:

  • GenericClassesFolder ou Genericclassesfolder ou genericClassesFolder (ou ainsi sans espaces ni 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

Qu'est-ce que je voulais faire?

  • de testFile.py, je voulais importer le fichier "targetClass.py" dans le fichier Generic-Class-Folder pour utiliser la fonction "functionExecute" dans le fichier "targetClass.py".

Quel commandement j'ai fait?

  • de 'testFile.py', a écrit la commande, from Core.Generic-Class-Folder.targetClass import functionExecute
  • Vous avez des erreurs comme SyntaxError: invalid syntax

Essayé de nombreuses recherches et consulté de nombreuses questions de stackoverflow et incapable de décider ce qui n'allait pas. J'ai vérifié mes fichiers plusieurs fois, j'ai utilisé __init__.py fichier, chemin d’environnement inséré et extrêmement inquiet de ce qui ne va pas ......

Et après un très long moment, j'ai compris cela en discutant 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, voici ce que je voulais transmettre. Bonne journée!

(désolé pour le post énorme à ce sujet ... laissez juste mes frustrations aller .... :) Merci!)

17
Vivek22

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

Aussi, vous pouvez ajouter manuellement votre répertoire actuel (src dans votre cas) à pythonpath:

import os
import sys
sys.path.insert(0, os.getcwd())
5
Max Kamenkov

Supposons que votre projet est structuré de la manière suivante:

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

Dans run.py, Vous pouvez importer les scripts un et deux en:

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

Maintenant, toujours dans run.py, Vous pourrez appeler leurs méthodes avec:

One.method_from_one(param)
Two.method_from_two(other_param)
1
Flavio Wuensche