Question SystemError: Module parent '' non chargé, impossible d'effectuer une importation relative [dupliquer]


Cette question a déjà une réponse ici:

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, je reçois 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'ai pas de complétion automatique quand 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, j'obtiens l'erreur suivante: "ImportError: aucun module nommé" mymodule ".

Que puis-je faire?


62
2017-11-20 23:23


origine


Réponses:


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 courant   module. Puisque le nom du module principal est toujours "__main__",   modules destinés à être utilisés comme module principal d'une application Python   doivent toujours utiliser des importations absolues.


38
2017-08-23 03:14



J'utilise généralement cette solution de contournement:

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

Ce qui signifie que votre EDI devrait choisir le bon emplacement de code et que l'interpréteur python réussira à exécuter votre code.


7
2017-07-05 08:49



si vous venez de lancer le main.py sous le app, importez comme

from mymodule import myclass

si tu veux 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 principale question est de savoir comment appeler app.main.


3
2017-09-14 06:51



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

[username@localhost myProgram]$

plutôt que ceci:

[username@localhost app]$

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

python3 mymodule.py

Changez la en ceci:

python3 app/mymodule.py

Ce processus peut être répété à 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é.


1
2017-09-14 04:45