Seite 1 von 1

Datei aus egg per open/file einlesen

Verfasst: Freitag 26. März 2010, 16:05
von rads
Hallo Pyhton Community,

ich schämme mich schon fast eine solche Frage zu stellen, aber leider komme ich seit längerer Zeit und einer ausgedehnten Google-Tour nicht weiter.

Ich habe z.b. folgende Egg-Struktur

0 setup.py
1 - __inital__.py
1 - helloplugin.py
1 -htdocs
2 --http
3 --myFile.http


Nun möchte ich in helloplugin.py das file myFile.http aus dem Ordner /htdocs/http einlesen. Leider ist es mir nicht möglich dieses File anzusprechen (File not found exception)

z.b. file = open('/htdocs/http/myFile.http','r')

Gibt es ein besonderes vorgehen um das File aus dem gleichen egg-Paket zu lesen?


Ich würde mich über Antworten freuen.

Danke für eure Unterstützung

Grüße

p.s. Das Egg ist im Einsatzgebiet Trac tätig, falls diese zusätzliche Information relevant ist

Verfasst: Freitag 26. März 2010, 16:09
von Hyperion
Wenn es im gelichen Pfad liegt, dann reicht doch ein relativer Pfad:

Code: Alles auswählen

with open("myFile.http", "r") as infile:
    pass

Verfasst: Freitag 26. März 2010, 16:21
von cofi
Hyperion hat geschrieben:

Code: Alles auswählen

with open("htdocs/http/myFile.http", "r") as infile:
    pass
FTFY. Es ist ja nicht derselbe Pfad.

Verfasst: Freitag 26. März 2010, 16:23
von rads
Hallo Hyperion,

danke schonmal für deine Antwort.

Es liegt im gleichen egg, bzw. in einem Unterordner des Egg's.

Zugriff: file=open('/htdocs/http/myFile.http','r')
[Ordnderstruktur wie oben angegeben]

file =open('myFile.http','r')
[myFile.http ist im gleichen egg-Ordner wie as ausführende Py-File]


Aber auch wenn es im gleichen Verzeichnis des Egg's liegt, bekomme ich eine file not found Meldung.

Es ist schon möglich ein File in ein egg einzubinden, und anschließend über relative Addressierung darauf zuzugreifen?

Grüße

Verfasst: Freitag 26. März 2010, 16:24
von Hyperion
cofi hat geschrieben:
Hyperion hat geschrieben:

Code: Alles auswählen

with open("htdocs/http/myFile.http", "r") as infile:
    pass
FTFY. Es ist ja nicht derselbe Pfad.
Oooops, jo, zu schnell überflogen bzw. die "Stríche" falsch gedeutet ;-)

Verfasst: Freitag 26. März 2010, 16:26
von Hyperion
rads hat geschrieben: Es ist schon möglich ein File in ein egg einzubinden, und anschließend über relative Addressierung darauf zuzugreifen?
Was meinst Du denn mit "egg"? Ein egg ist doch afaik nichts anderes als ein zip-Ordner, der einen bestimmten Aufbau hat. Du hast "open()" angeführt, welches zum Öffnen von Dateien aus dem Filesystem da ist - insofern dachte ich jetzt, dass Du die Dateien und Ordner auch einfach so vorliegen hast und diese nicht gezippt sind o.ä. Also spielt es doch keine Rolle, ob es ein egg oder sinst was ist...

Verfasst: Freitag 26. März 2010, 16:36
von rads
Leider brauche ich die egg-Struktur, da ich wie zu Begin angführt mich leider mit der Plugin-Entwicklung für trac beschäftigen muss.

Ein Test des Pyhton-Codes ist nur mit den Trac-Bibliotheken/source-code möglich.


Ich schreibe folglich ein Programmcode, welches als egg verpackt wird und anschließend in das Tracsystem "installiert" wird.

Ich war der Überzeugung, das wenn das egg wieder ausgepackt wird, die Ordnerstruktur vorhanden bleibt und somit eine relative Adressierung möglich ist.

An sich ist dies zumindest teilweise so,

ich kann so z.B. in einem Template über
<a href="${href.chrome('/hw/html/budgetingfieldset.html')}">text</a>
das File ansprechen
(hw ist ein präfix für hrefs)
jedoch an der gleichen stelle nicht über
<xi:include href="${href.chrome('/hw/html/budgetingfieldset.html')}">
erreichen.

So war grundsätzlich meine Idee, ich könnte über openFile den Inhalt einlesen und anschließend mit Stream-Verarbeitung den gewünschten Inhalt in das html-Dokument einbinden.


Ich hoffe mich diesmal weniger missverständlich ausgedrückt zu haben

Güße und Danke

Verfasst: Freitag 26. März 2010, 17:03
von cofi
Der Weg von `helloplugin.py` ab:

Code: Alles auswählen

import os.path
egg_basedir = os.path.dirname(os.path.abspath(__file__))
httpdir = os.path.join(egg_basedir, "htdocs", "http")
Ob es etwas spezielles fuer eggs gibt, kann ich leider nicht sagen.

Verfasst: Freitag 26. März 2010, 17:22
von rads
Danke für die Antwort,

hat mir leider nicht geholfen, ich hatte schon vergelichbare Methoden

Code: Alles auswählen

    def get_templates_dirs(self):
        return [resource_filename(__name__, 'templates')]

    def get_htdocs_dirs(self):
        return [('hw', resource_filename(__name__, 'htdocs'))]  

ich werde es mir morge nochmal anschauen, vielleicht stehe ich heute auf der Leitung.

Grüße

Verfasst: Mittwoch 31. März 2010, 09:29
von rads
Hallo,

wollte nur der Vollständigkeit halber noch das Ergebnis posten.

Wahrscheinlich habe ich mich vergangenen Freitag einfach wie so oft "blöd" angestellt.

Auf das echte File, und nicht das temporäre im Tmp-Folder, komme
ich nun wie folgt

Code: Alles auswählen

 os.path.dirname(__file__)+"/htdocs/html/budgetingfieldset.html"
Hatte zeitweise das Problem, das er mir mit

Code: Alles auswählen

egg_basedir = os.path.dirname(os.path.abspath(__file__))
das Egg nicht "verpackt" hatte und ich es somit nicht in das Tool installieren konnte.
Deweiteren hat er kurzzeitig immer das File im Tmp-Folder angesprungen.

Falls jemand noch eine schönere Lösung kennt, bin ich für Anregungen natürlich offen. Ansonsten schonmal danke für eure Hilfe!

Grüße

Verfasst: Mittwoch 31. März 2010, 09:33
von ms4py
rads hat geschrieben:Falls jemand noch eine schönere Lösung kennt, bin ich für Anregungen natürlich offen. Ansonsten schonmal danke für eure Hilfe!
Nutze os.path.join anstatt der Stringkonkatenation (und den Slashes).