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?
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.
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.
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
.
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é.