Package

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
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Ich habe etwa folgende Ordner-Struktur:

[codebox=text file=Unbenannt.txt]
toolname (Ordner)
setup.py
> toolname (package)
>> toolname.py (= main)
>> modul1.py
>> modul2.py
[/code]

Das steht in meiner setup.py-Datei:

Code: Alles auswählen

from distutils.core import setup

setup( 
     name = "toolname", 
     version = "1.0", 
     packages=['toolname',],   
     py_modules = ["toolname"] 
     )
Irgendwie werden die Module erkannt, nicht aber das Hauptmodul, wo die Programmlogik drinliegt, d. h. eine Klasse kann ich von dort nicht importieren. Kann mir jemand helfen? Kann ich dem Hauptordner, dem package und der Hauptdatei (.py) den identischen Namen geben?
BlackJack

@pixewakb: Wenn das Package `toolname` heisst, dann und darin ein Modul `toolname` liegt, dann ist das doch eigentlich `toolname.toolname`. Ist diese Doppelung wirklich so gewollt? Was steht denn in der `__init__.py` von dem Package? Denn das ist ja das Modul was man beim Import des Packages `toolname` bekommt.

Oder sollte `toolname.py` eigentlich das Programm sein das die Bibliothek `toolname` benutzt? Dann gehört es nicht *in* das Package, beziehungsweise brauchst Du noch ein Programm (welches auch gerne noch mal `toolname.py` heissen kann) welches das Modul `toolname.toolname` importiert und daraus etwas aufruft.

Ansonsten bin ich etwas verwirrt was `py_modules` letztendlich soll. Wenn das Modul Teil des Packages ist, dann reicht es ja das Package anzugeben.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

BlackJack hat geschrieben:Was steht denn in der `__init__.py` von dem Package?
Ich dachte, dass diese Datei immer leer bleiben muss?

Ich habe die Ordnerstruktur jetzt noch mal geändert und zwar dahingehend:
[codebox=text file=Unbenannt.txt]
* package (Ordner)
** __init__.py
** modul1.py
** modul2.py
** usw. usf.
tool.py
setup.py
[/code]
Mein setup.py-Skript hat jetzt folgenden Inhalt:

Code: Alles auswählen

from distutils.core import setup

setup( 
     name = "tool", 
     version = "3.0", 
     py_modules = ["package"] 
     )
Damit konnte ich es jetzt gerade installieren und es läuft. Im Moment blicke ich nicht ganz durch, bin aber dankbar, dass es läuft. An diesem Paket habe ich seit dem 17. Januar gearbeitet und bin momentan einfach nur dankbar, dass es läuft.

Es ist das erste Mal, dass ich mit einem package und einer setup.py-Datei gearbeitet habe. Bislang waren alle meine Skripte kleiner und d. h. ein Skript und eine setup.py ohne package. Das zuerst gezeigte setup.py-Tool war an ein Beispiel im Netz angelehnt.
BlackJack

@pixewakb: Die `__init__.py` enthält das was man bekommt wenn man ``import package`` oder ``from package import something_from_package_except_submodules`` ausführt. Leer bleiben muss die bei Namespace-Packages weil es dann ja mehr als eine `__init__.py` gibt die sich diese Position in der Packagehierarchie ”teilt”.

Ich hätte `package` in `packages` gelassen und `py_modules` weg gelassen. Und wenn mit der `tool.py` noch etwas passieren sollte, also wenn die als Programm installiert werden soll müsste man noch `scripts` verwenden.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Ich habe das mit packages geändert, was ist mit scripts gemeint!? Das tool.py ist das Programm, was ich eigentlich nutze, da ist der Programmkern enthalten. Aktuell läuft es fehlerfrei, d. h. ich kann von dort importieren und die Klassen funktionieren.

Aus dem Abschnitt

https://docs.python.org/3.4/distutils/s ... ng-scripts

werde ich ehrlich gesagt nicht ganz schlau. Was leistet scripts und wozu genau brauche ich das? (Mich wundert, dass es jetzt scheinbar schon läuft!?) Danke!
BlackJack

@pixewakb: Das ist dazu da um die Skripte *zu installieren*. Oder wandert Dein `tools.py` auf magische Weise an die richtige Stelle? :-)
Antworten