Importsystem Verständnisfrage

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
barrio
User
Beiträge: 30
Registriert: Dienstag 26. Februar 2013, 13:15

Hallo zusammen,

ich habe mein erstes größeres Projekt begonnen und möchte folgende häufig gebräuchliche Projektstruktur in einem virtualenv realisieren:

Code: Alles auswählen

myapp/
    setup.py
    myapp/
        __init__.py
        myapp.py
        myimport1.py
        ...
    tests/
        test_myapp.py
        ...
Als Testmodul verwende ich py.test. Ich möchte natürlich folgendes beides im Terminal von project root aus tun können:

Code: Alles auswählen

$> python myapp/myapp.py
$> py.test tests/test_myapp.py
Ich habe diverse Möglichkeiten an relativen und absoluten imports ausprobiert um myimport1.py in myapp.py einzubinden, aber entweder beschwert sich py.test oder python, egal wie ich es mache. Dann bin ich in einem Post darauf gestoßen, dass Guido the BDFL diese Projektstruktur angeblich als Antipattern betrachtet, da seiner Meinung nach myapp.py nicht mit anderen Modulen im selben Verzeichnis sein sollte.

Könnte mir das jemand etwas erläutern, weshalb das schlecht ist? Die Alternativen myapp.py nach project root oder in ein separates Verzeichnis mit nur dieser Datei zu verschieben erscheinen mir beide auch nicht sonderlich elegant, oder?
> (...(lambda...(it-schemes-i-must-be-jailed-in-braces? code)...))))))))))))))))))))))))))
#t
BlackJack

@barrio: Ich denke nicht dass das Problem ist das dieses Modul im Package ist sondern dass Du es direkt als Programm starten möchtest weil Programme ja normalerweise ausserhalb von Packages stehen damit sie vom Betriebssystem gefunden werden, also irgendwo in $PATH beziehungsweise %PATH%. Meistens bestehen solche Programme dann auch nur aus so etwas wie ``import myapp.myapp_cli.main; main()``, also das Hauptprogramm ist weiterhin in einem Modul in dem Package.

Module in einem Package sollte man nicht durch die Angabe des Pfades zum Modul starten sondern über das Package, also in Deinem Fall ``python -m myapp.myapp``. Die Namensdopplung ist IMHO ein wenig eigenartig. Ich würde das Modul im Package entweder in die `__init__.py` verschieben oder umbenennen. Beispielweise in `__main__.py` wenn da das Hauptprogramm drin steht.
Antworten