SystemError: Oudermodule ” niet geladen, kan geen relatieve importeren

Ik heb de volgende map:

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()

Maar wanneer ik het uitvoer, krijg ik deze foutmelding:

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

Dit werkt:

from mymodule import myclass

Maar ik krijg geen auto-voltooiing wanneer ik dit in typ en er is een bericht: “Niet-opgeloste referentie: mymodule” en “onopgeloste referentie: MyClass”.
En in mijn andere project, waar ik aan werk, krijg ik de foutmelding: “Importerror: geen module met de naam ‘MyModule’.

Wat kan ik doen?


Antwoord 1, Autoriteit 100%

Ik had hetzelfde probleem en ik loste het op met behulp van een absolute import in plaats van een relatieve.

Bijvoorbeeld in uw geval, kunt u zoiets schrijven:

from app.mymodule import myclass

Je kunt het zien in de documentatie.

Houd er rekening mee dat relatieve importen zijn gebaseerd op de naam van de huidige
module. Aangezien de naam van de hoofdmodule altijd “__main__” is,
modules bedoeld voor gebruik als de hoofdmodule van een Python-toepassing
moet altijd absolute import gebruiken.

Bewerken: Als u deze fout tegenkomt ImportError: No module named 'app.app'; 'app' is not a package, vergeet niet het bestand __init__.pytoe te voegen aan uw app-directory zodat de interpreter het als een pakket kan zien. Het is prima als het bestand leeg is.


Antwoord 2, autoriteit 35%

Ik gebruik meestal deze tijdelijke oplossing:

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

Wat betekent dat uw IDE de juiste codelocatie moet oppikken en dat de python-interpreter uw code kan uitvoeren.


Antwoord 3, autoriteit 15%

als je gewoon de main.pyuitvoert onder de app, importeer dan zoals

from mymodule import myclass

als je main.pyin een andere map wilt aanroepen, gebruik dan:

from .mymodule import myclass

bijvoorbeeld:

├── 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)

Dus ik denk dat de belangrijkste vraag van jou is hoe je app.mainmoet bellen.


Antwoord 4, autoriteit 4%

Als je een niveau hoger gaat in het uitvoeren van het script in de opdrachtregel van je bash-shell, zal het probleem worden opgelost. Gebruik hiervoor de opdracht cd ..om de werkdirectory te wijzigen waarin uw script wordt uitgevoerd. Het resultaat zou er als volgt uit moeten zien:

[[email protected] myProgram]$

in plaats van dit:

[[email protected] app]$

Zodra u daar bent, in plaats van het script in de volgende indeling uit te voeren:

python3 mymodule.py

Verander het in dit:

python3 app/mymodule.py

Dit proces kan één niveau hoger worden herhaald, afhankelijk van de structuur van uw boomdiagram. Voeg ook de compilatieopdrachtregel toe die u de genoemde foutmelding geeft.

Other episodes