私は同僚が作成したプロジェクトProject A
を別のpythonプロジェクトに統合しようとしています。今、この同僚は彼のコード内で相対的な輸入を使用していないが、代わりに変更されたモジュールパスを持つPythonオブジェクトをピッキング解除する
from packageA.moduleA import ClassA
from packageA.moduleA import ClassB
を行って、その結果cPickle
を持つクラスを漬け。きちんとしているので、彼のプロジェクト(Project A
)が私のプロジェクトの中に構築されたパッケージを隠したいと思っています。ただし、これはpackageA
で定義されたクラスのパスを変更します。いいえ問題は、私はちょうど
from ..packageA.moduleA import ClassA
from ..packageA.moduleA import ClassB
を使用してインポートが、今のクラスは、なぜ明らかモジュールDEFSを見ていcPickle
ん
with open(fname) as infile: self.clzA = cPickle.load(infile)
ImportError: No module named packageA.moduleA
したがって、次のメッセージで失敗し、未酸洗を再定義していないでしょう。 packageA
のルートをシステムパスに追加する必要がありますか?これは問題を解決する正しい方法ですか?
cPickled
ファイルが古いプロジェクト階層は、私が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
私はKRunner用のプラグインを書いて、この問題に出くわしました。 Plasmaで使用されているスクリプトエンジンは、パスフックを使用して、自分のコードがある偽のパッケージを作成しました。 残念ながら、私はこれを解決する方法を見つけることができませんでした。私ができる唯一のことは、パスフックを手動で削除し、 'sys'キャッシュをクリアしてすべてを再インポートすることでした。しかし、もしあなたがいくつかのピクルされたデータを持っているなら、あなたは同じクラス名でそれをunpickleする必要があります(つまり 'from packageA.moduleA import ClassA'を保つ必要があります)。 一度アンピールしたら、正しい名前を使用してピッカーを再ピックすることができます。 – Bakuriu