web-dev-qa-db-fra.com

SystemError: le module parent '' n'est pas chargé, impossible d'effectuer une importation relative

J'ai le répertoire suivant:

myProgram
└── app
    ├── __init__.py
    ├── main.py 
    └── mymodule.py

mymodule.py:

class myclass(object):

def __init__(self):
    pass

def myfunc(self):
    print("Hello!")

main.py:

from .mymodule import myclass

print("Test")
testclass = myclass()
testclass.myfunc()

Mais quand je le lance, alors j'obtiens cette erreur:

Traceback (most recent call last):
  File "D:/Users/Myname/Documents/PycharmProjects/myProgram/app/main.py", line 1, in <module>
    from .mymodule import myclass
SystemError: Parent module '' not loaded, cannot perform relative import

Cela marche:

from mymodule import myclass

Mais je n'obtiens aucune complétion automatique lorsque je tape ceci et il y a un message: "référence non résolue: mymodule" et "référence non résolue: myclass". Et dans mon autre projet sur lequel je travaille, je reçois l’erreur suivante: "ImportError: Aucun module nommé" mymodule ".

Que puis-je faire?

87
phez1

J'ai eu le même problème et je l'ai résolu en utilisant une importation absolue au lieu d'une importation relative.

par exemple, dans votre cas, vous écrirez quelque chose comme ceci:

from app.mymodule import myclass

Vous pouvez voir dans le documentation .

Notez que les importations relatives sont basées sur le nom du module actuel. Le nom du module principal étant toujours "__main__", les modules destinés à être utilisés comme module principal d'une application Python doivent toujours utiliser des importations absolues.

48
Erman

J'utilise habituellement cette solution de contournement:

try:
    from .mymodule import myclass
except Exception: #ImportError
    from mymodule import myclass

Ce qui signifie que votre IDE devrait choisir le bon emplacement pour le code et que l'interprète python parviendra à exécuter votre code.

16
thomas

si vous lancez simplement le main.py sous le app, importez simplement comme

from mymodule import myclass

si vous voulez appeler main.py sur un autre dossier, utilisez:

from .mymodule import myclass

par exemple:

├── app
│   ├── __init__.py
│   ├── main.py
│   ├── mymodule.py
├── __init__.py
└── run.py

main.py

from .mymodule import myclass

run.py

from app import main
print(main.myclass)

Donc, je pense que la question principale de vous est comment appeler app.main.

7
mymusise

Si vous montez de niveau en exécutant le script dans la ligne de commande de votre shell bash, le problème sera résolu. Pour ce faire, utilisez la commande cd .. pour modifier le répertoire de travail dans lequel votre script sera exécuté. Le résultat devrait ressembler à ceci:

[username@localhost myProgram]$

plutôt que cela:

[username@localhost app]$

Une fois que vous y êtes, au lieu d’exécuter le script au format suivant:

python3 mymodule.py

Changez-le en ceci:

python3 app/mymodule.py

Ce processus peut être répété une fois de plus d’un niveau supérieur en fonction de la structure de votre diagramme en arbre. Veuillez également inclure la ligne de commande de compilation qui vous donne le message d'erreur mentionné.

3
Allan