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)?
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.
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å