2016-03-08 11 views
7

Also ich habe diese Python-Sache, die eine Datei verarbeiten muss.Was ist eine sehr einfache Art, ein Python-Projekt zu strukturieren?

Zuerst war es:

my_project/ 
├── script.py 

Und ich würde es einfach mit python script.py file.csv laufen.

Dann wurde es und wurde:

my_project/ 
├── script.py 
├── util/ 
│ └── string_util.py 
├── services/ 
│ └── my_service.py 

(Es gibt eine leeres __init__.py in jedem Verzeichnis)

Aber jetztmy_service.py möchten string_util.py verwenden und es ist so verdammt nicht einfach, wie man das schön macht.

würde Ich mag from ..util import string_util tun in my_service.py (die in script.py mit from services import my_service importiert wird), aber das funktioniert nicht mit python script.py seit my_service ‚s __name__ ist dann nur services.my_service (und ich bekomme die Attempted relative import beyond toplevel package)

  • kann ich cd .. und python -m my_project.script, aber das scheint so unnatürlich und wäre wirklich schlecht, es in die README für die Anweisungen, wie man das ausführen.

  • Momentan löse ich es mit dem hässlichen sys.path.append() Hack.

Welche anderen Optionen habe ich?

+0

Ich kann meine Meinung teilen, aber es wird als Antwort veröffentlicht werden. Ich weiß, was du denkst. – idjaw

Antwort

2

Das grenzt an die Meinung, aber ich werde meine Sicht darauf teilen.

Sie sollten Ihr Projekt anders betrachten. Wählen Sie einen Ausführungspunkt, und verweisen Sie von dort auf Ihre Importe, um alle ungeraden relativen Importe zu vermeiden, mit denen Sie umgehen möchten. Also, suchen Sie in Ihrer Projektstruktur:

my_project/ 
├── script.py 
├── util/ 
│ └── string_util.py 
├── services/ 
│ └── my_service.py 

Wie Sie gerade tun werden, führen Sie den Code aus my_project. Auf diese Weise sollten alle Ihre Importe in Bezug auf diesen Punkt sein. Daher Ihre Importe tatsächlich aussehen wie folgt aus:

# my_service.py 

from util.string_util import foo 

Ein anderer Weg, um darüber nachzudenken, ist, dass, wenn Sie Ihr Projekt in ständiger Bewegung sind, oder ein CI haben, müssen Sie sicherstellen, dass Sie machen angeben, was die Wurzel Projekt Sie möchten von ausführen. Wenn Sie diese Dinge im Hinterkopf behalten und den einzelnen Ausführungspunkt angeben, an dem Ihr Projekt ausgeführt werden soll, wird Ihr Leben viel einfacher, wenn es darum geht, Ihre Pakete und Module zu strukturieren und sie entsprechend zu referenzieren, damit andere Systeme Ihr Projekt richtig nutzen können ohne mit seltsamen relativen Importen fertig zu werden.

Hoffe, das hilft.

+0

Wow, das ist mir überhaupt nicht eingefallen. Und es ist so einfach. Also kann ich einfach die '..' aus dem' from ..util import string_util' entfernen und alles ist cool. (Wenn ich mit absoluten Importen hier cool bin, was ich bin.) Es hilft sicher. Vielen Dank! – Bloke