2 svar
70 visningar
Hondel är nöjd med hjälpen
Hondel 1294
Postad: 11 dec 2020 09:21

Importera egna moduler

Hej,

Jag har en struktur som ser ut ungefär såhär (generiska namn):

dir/
     classes/
         constants.py
         class.py
     main.py

I class.py importerar jag constants.py med "import constants" (jag skulle vilja kunna utöka med class2.py och även där importera constants)

I main.py importerar jag från class.py med "from classes.class import Class". 

Jag får då felet "no module named constants" när jag kör main.py. Jag antar att det är för att constants.py ligger i dir/classes men main.py körs från dir, för när jag i constants.py ändrar till import classes.constants så funkar det. Men det ser ju inte speciellt bra ut för om jag skulle importera class.py från någon annanstans skulle det bli nytt problem. Så första frågan är då: har jag gjort något fel i min struktur av moduler? Om det är ok att ha såhär, hur gör jag för att det ska funka, utan att behöva fixa specialfall (lägga till classes i importen av constants)?

Skaft 2373 – F.d. Moderator
Postad: 11 dec 2020 09:46 Redigerad: 11 dec 2020 09:46

Du behöver nog speca mappnamnet även när du importerar constants från class. Lite osäker, men vad jag tror händer är att när programmet körs är du i mappen dir/, och även om main hämtar kod från classes/, så är current working directory fortfarande dir/. Och är man i dir/ blir kodraden "import constants" svårtolkad eftersom filen inte ligger där. Så prova "import classes.constants" istället, även om filerna ligger i samma mapp.

Hondel 1294
Postad: 11 dec 2020 10:01
Skaft skrev:

Du behöver nog speca mappnamnet även när du importerar constants från class. Lite osäker, men vad jag tror händer är att när programmet körs är du i mappen dir/, och även om main hämtar kod från classes/, så är current working directory fortfarande dir/. Och är man i dir/ blir kodraden "import constants" svårtolkad eftersom filen inte ligger där. Så prova "import classes.constants" istället, även om filerna ligger i samma mapp.

Jag provade "from . import constants" och det verkar funka.

Att skriva "import classes.constants" provade jag först och även om det funkar vet jag inte vad som händer om jag skulle skapa ett nytt directory dir/dir2 och där ha ett skript som importerar class. Den skulle då försöka importera classes.constants, men classes är ju inte ett directory i dir/dir2 så vet inte riktigt vad som skulle hända.

Men att använda "from . import constants" ser jag inte att något sådan problem skulle kunna uppstå

Svara Avbryt
Close