Unpickling python-Objekte mit einem geänderten Modul-Pfad

Ich versuche zu integrieren, ein Projekt Project A gebaut, von einem Kollegen in ein anderes python-Projekt. Nun ist diese Kollegin nicht verwendet relative Importe in seinem code, sondern stattdessen getan

from packageA.moduleA import ClassA
from packageA.moduleA import ClassB

und folglich gebeizt die Klassen mit cPickle. Für die Sauberkeit möchte ich ausblenden, das Paket, dass seine (Project A) gebaut in meinem Projekt. Dies allerdings ändert sich der Pfad des definierten Klassen in packageA. Kein problem, ich werde einfach neu definieren Sie den import mit

from ..packageA.moduleA import ClassA
from ..packageA.moduleA import ClassB

aber jetzt die un einlegen der Klassen schlägt mit der folgenden Meldung

    with open(fname) as infile: self.clzA = cPickle.load(infile)
ImportError: No module named packageA.moduleA

Warum also nicht cPickle anscheinend sehen das Modul defs. Muss ich hinzufügen, um die Wurzel des packageA system Weg? Ist dies der korrekte Weg das problem zu lösen?

Den cPickled Datei sieht so etwas wie

ccopy_reg
_reconstructor
p1
(cpackageA.moduleA
ClassA
p2
c__builtin__
object
p3
NtRp4

Dem alten Projekt-Hierarchie ist von der Art,

packageA/
    __init__.py
    moduleA.py
    moduleB.py
packageB/
    __init__.py
    moduleC.py
    moduleD.py

Möchte ich alle, die in einem WrapperPackage

MyPackage/
.. __init__.py
.. myModuleX.py
.. myModuleY.py
WrapperPackage/
.. __init__.py
.. packageA/
   .. __init__.py
   .. moduleA.py
   .. moduleB.py
.. packageB/
   .. __init__.py
   .. moduleC.py
   .. moduleD.py
  • Ich stieß auf dieses problem schriftlich ein Plugin für KRunner. Der script-engine verwendet, die durch Plasma verwendet einen Pfad Haken zum erstellen einer fake-Paket, wo mein code war. Leider konnte ich keinen Weg, dies zu lösen. Das einzige, was ich tun konnte, war, manuell zu entfernen, Ihren Weg zu Haken, deaktivieren Sie das sys caches und importieren alles. Aber wenn Sie einige eingelegte Daten, dann müssen Sie unpickle es mit dem gleichen class Namen(das heißt, Sie müssen halten die from packageA.moduleA import ClassA). Beachten Sie, dass einmal unpickled Sie können re-Gurke Sie mit dem richtigen Namen.
InformationsquelleAutor Matti Lyra | 2012-11-15
Schreibe einen Kommentar