[Python-de] Globaler "prefix" o.ae.
Thomas 'PointedEars' Lahn
PointedEars at web.de
Mo Sep 12 21:55:33 CEST 2011
Dinu Gherman wrote:
> Daher würde ich zumindest es gerne sehen, wenn diese Geschichte
> an einem anderen Ort (vielleicht auf einer Debian-Liste?) ausge-
> tragen würde,
Du liest hier noch nicht lange mit, oder?
> und, sofern eine Lösung existiert, diese dann hier bekannt gemacht würde.
Soifz. [psf 10.1]
Eine mögliche Lösung habe ich doch schon erklärt. Für diejenigen, denen das
jetzt immer noch nicht klar ist:
*Wenn* man den Originalquelltext von Python-Paketen nicht ändern kann oder
will, aber *trotzdem* Namenskollisionen mit bestehenden Paketen vermeiden
will, muss man eben ein neues Python-Paket schnüren, in das man die
vorhandenen Python-Pakete einpackt (hier: mypackage).
Dann *muss* man den Suchpfad geeignet anpassen. Eine Ansatzpunkt dafür ist
die PYTHONPATH-Umgebungsvariable (diese kann bei der Debian-
Paketinstallation auch *systemweit* automatisch angepasst werden), ein
anderer ist sys.path (welches den PYTHONPATH sowie Default-Pfade
beinhaltet). Das sieht z. B. folgendermassen aus:
-[mypackage/__init__.py]----------------------------------------------
import sys
import os
def _init():
my_path = os.path.dirname(__file__)
if not my_path in sys.path:
sys.path.insert(1, my_path)
_init()
del _init
-[mypackage/database/ps2/Database/database.py]------------------------
from common.config.Profile import profiles
def foo():
profiles.bar()
-[mypackage/common/config/Profile/profiles.py]------------------------
def bar():
print 42
-[test.py]------------------------------------------------------------
import mypackage
from mypackage.database.ps2.Database import database as mydatabase
#from otherpackage.database import database
mydatabase.foo()
#database.bla()
----------------------------------------------------------------------
Wie man sieht, kann der Originalquelltext hier unverändert bleiben; nur die
__init__.py des äusseren Python-Pakets muss man hinzufügen, und dann muss
man das äussere Python-Paket explizit importieren (da dieses dann den
Suchpfad um seinen Verzeichnispfad ergänzt). Das äussere Paket muss sich
natürlich selbst im Suchpfad befinden.
Diese Lösung ist natürlich nicht besonders schön; besser wäre sauberer
Quelltext im Originalpaket. Aber es funktioniert –
$ PYTHONPATH=../tmp python test.py
42
–, und der Änderungs- und Dokumentationsaufwand ist minimal. Vermutlich
gibt es auch noch bessere Hacks, die Regeln für das Finden des Moduls bei
der import-Anweisung sind ja recht komplex (RTFM).
In jedem Fall wurde bereits von anderer Seite korrekt darauf hingewiesen,
dass ein Python-Paket mit unsauberer Struktur allenfalls im privaten Debian-
Repository aufgenommen werden wird.
HTH
--
PointedEars
Please do not Cc: me. / Bitte keine Kopien per E-Mail.
Mehr Informationen über die Mailingliste python-de