Import Problem Test Ordner vs. Package Ordner

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
raveN1
User
Beiträge: 2
Registriert: Montag 6. August 2012, 08:31

Hallo zusammen,

habe zur Zeit ein Problem bei dem ich auch nach langer Recherche und Ausprobieren nicht weiterkomme.

Mein Projekt hat folgende Projektstruktur:

project/
--package_name/
----__init__.py
----moduleA.py (Hauptmodul)
----moduleB.py
----moduleC.py
--tests/
----moduleA_test.py
----moduleB_test.py
----moduleC_test.py

Hier ist moduleA.py das Hauptmodul das alle anderen Module importiert und direkt ausgeführt werden kann.
moduleB.py und moduleC.py enthalten Docstring-Tests und werden zu diesem Zwecke auch ausgeführt.
Die Test Files decken dann kompliziertere TestCases ab, wie bspw File Import und anschließender Abgleich.

Mein Problem:
Der Import von "package_name" funktioniert entweder in den Test Files, dann geht er in den Modulen nicht und umgedreht.

In moduleA.py hatte ich ursprünglich

Code: Alles auswählen

import moduleB
import moduleC
Hat funktioniert, keine Probleme. Wenn ich dann allerdings die Unit Tests renne kriege ich gesagt "No module named moduleB", d.h. er kann diesen "relativen" Import nicht auflösen.

Ändere ich es in

Code: Alles auswählen

from . import moduleB
from . import moduleC
funktionieren die Unit Tests, aber ich kann die einzelnen Module nicht mehr starten, weil relative Imports in nicht packages verboten sind :x

In meinen Unittests importiere ich das komplette Package mit dem Path Hack (gefunden):

Code: Alles auswählen

import sys
import os
import unittest

# Path hack
sys.path.insert(0, os.path.abspath('..'))
import package_name
Die __init__.py (falls wichtig) sieht so aus:

Code: Alles auswählen

from . import moduleA.py
from . import moduleB.py
from . import moduleC.py
Was kann man denn machen das beides funktioniert?
BlackJack

@raveN1: Du könntest in den Tests ``from package_name import moduleA`` schreiben und die vom ``project/`-Verzeichnis aus aufrufen. So wie man das halt auch machen würde wenn man die Module in dem Package benutzen würde.
raveN1
User
Beiträge: 2
Registriert: Montag 6. August 2012, 08:31

@BlackJack:
Klappt irgendwie nicht. Es ist immer das "import moduleB" das Probleme hervorruft. Irgendwas scheint beim Importieren nicht zu klappen.

Wenn ich in moduleA.py bin, wie importiere ich dann moduleB.py?
BlackJack

Da es auf der gleichen Ebene ist sollte ein ``import moduleB`` ausreichen.
Antworten