2009-05-14 8 views
1

ich einen minimalen Ersatz für mod_python des publisher.py SchreibenPython-Modul Path

Die Grundvoraussetzung ist, dass es Module auf der Basis einer URL-Schema wird geladen:

/foo/bar/a/b/c/d 

Wodurch/foo/sein könnte Ein Verzeichnis und 'bar' ist eine Methode ExposedBar in einer publizierbaren Klasse in /foo/index.py. Ebenso könnte/foo auf/foo.py und bar eine Methode in der exposed-Klasse sein. Die Semantik ist nicht wirklich wichtig. Ich habe eine Linie:

sys.path.insert(0, path_to_file) # /var/www/html/{bar|foo} 
mod_obj = __import__(module_name) 
mod_obj.__name__ = req.filename 

Dann wird das Modul für die entsprechende Klasse/Funktionen/Methoden geprüft wird. Wenn der Prozess die verbleibenden URI-Daten so weit wie möglich erreicht, wird/a/b/c an diese Methode oder Funktion übergeben.

Dies funktioniert gut, bis ich /var/www/html/foo/index.py hatte und /var/www/html/bar/index.py

Wenn im Browser sehen, es ist ziemlich zufällig ist Die Option 'index.py' wird ausgewählt, obwohl ich den ersten Suchpfad auf '/ var/www/html/foo' oder '/ var/www/html/bar' gesetzt und dann __import __ ('index') geladen habe. Ich habe keine Ahnung, warum es entweder durch scheinbar zufällige Wahl zu finden ist. Dies wird angezeigt durch:

Diese Frage ist dann, warum würde der __import__ nach dem Zufallsprinzip entweder Index auswählen. Ich würde das verstehen, wenn der Pfad '/ var/www/html' wäre, aber nicht. Zweitens:

Kann ich ein Modul über seinen absoluten Pfad in ein Modulobjekt laden? Ohne Änderung von sys.path. Ich kann keine Dokumente auf __import__ oder new.module() dafür finden.

+0

Sind Sie neu zu erfinden Turbogears? http://turbogears.org/ –

+0

Nein, nur auf der Suche nach einem schlanken Publisher, der genau das tun wird, was ich brauche, nicht mehr und nicht weniger. Und meine Hände schmutzig zu machen, ist eine gute Möglichkeit, Python zu lernen. –

+0

Eigentlich war meine Frage rhetorisch. Vielleicht möchten Sie sich sehr genau anschauen, was sie tun, es könnte Ihnen viel Zeit und Mühe ersparen. –

Antwort

2

Kann ich ein Modul über seinen absoluten Pfad in ein Modulobjekt laden? Ohne Änderung von sys.path. Ich kann keine Dokumente auf __import__ oder new.module() dafür finden.

import imp 
import os 

def module_from_path(path): 
    filename = os.path.basename(path) 
    modulename = os.path.splitext(filename)[0] 

    with open(path) as f: 
     return imp.load_module(modulename, f, path, ('py', 'U', imp.PY_SOURCE)) 
+0

Wunderbar. Vielen Dank. Als Neuling in Python erwartete ich, dass der Import einen einfachen "by path" -Mechanismus wie dlopen() in C –

+0

hat, funktioniert wie ein Charme :) danke dF –