[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